Ich bins nochmal....
Ich hab jetzt gemerkt, dass Sektor 0 meines Programms Sektor 251 des anderen Programms entspricht. Also liest er bei dem ersten Aufruf der Funktion "ReadSectorFromDrive" gleich Sektor 251 ein anstatt 0. Woran könnte das liegen?
Hier mal mein Code aus dem Modul:
'Windows-Variablen / Konstanten:
Private Type OVERLAPPED
Internal As Long
InternalHigh As Long
offset As Long
OffsetHigh As Long
hEvent As Long
End Type
Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000003
Private Const OPEN_EXISTING = 3
Private Const INVALID_HANDLE_VALUE = -1
Private Const FILE_DEVICE_FILE_SYSTEM = &H9
Private Const METHOD_BUFFERED = 0
Private Const FILE_READ_DATA = (&H1)
Private Const FILE_WRITE_DATA = (&H2)
'API-Deklarationen
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" _
(ByVal lpFileName As String, ByVal dwDesiredAccess As Long, _
ByVal dwShareMode As Long, lpSecurityAttributes As Any, _
ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes _
As Long, _
ByVal hTemplateFile As Long) As Long
Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, _
lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, _
lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" _
(ByVal hObject As Long) As Long
'Im Modul benötigt:
Dim lngFileHandle As Long 'Handle für Drive
Dim CreateFileError 'Fehler beim Erzeugen des Handles
Dim ReadFileError 'Fehler beim Lesen vom Laufwerk
Sub GetDriveHandle(Drivename$)
'muss zuerst aufgerufen werden um Zugang zum Drive zu bekommen
'Fehlervariablen zurücksetzen
CreateFileError = 0
ReadFileError = 0
FileName$ = "\\.\" & Drivename$
lngFileHandle = CreateFile(FileName$, GENERIC_READ Or GENERIC_WRITE, _
FILE_SHARE_READ, ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, ByVal 0)
'Bei Fehlschlag aussteigen2
If (lngFileHandle = INVALID_HANDLE_VALUE) Then
MsgBox "Invalid handle!"
CreateFileError = 1
Exit Sub
Else
'MsgBox "File handle:" & Str$(lngFileHandle)
End If
End Sub
Sub ReadSectorFromDrive(buffer() As Byte)
'liest 512 Bytes (1 Sektor) in buffer() ein
If CreateFileError Then
ReadFileError = 1
Exit Sub
End If
retReadFile& = ReadFile(lngFileHandle, buffer(0), 512, BytesRead&, 0&)
If retReadFile& = 0 Then
MsgBox "Readfile returns " & Str$(retReadFile&) & vbCrLf & "Read Error!"
ReadFileError = 1
Exit Sub
End If
End Sub
Sub CloseDriveHandle()
CloseHandle lngFileHandle
End Sub Das Schreiben der Sektoren wäre mir eigentlich viel wichtiger. Das lesen bräuchte ich höchstens um das geschriebene zu überprüfen (falls Sektoren defekt sind). |