Wenn das Setzen der neuen Position geglückt ist,
gibt dir SetFilePointer die von dir gewünschte Position zurück,
in dem Fall den Wert deiner Variablen "adress".
Wenn SetFilePointer fehlschlägt, ist der Rückgabewert -1.
Zu dem Sektor 251 könnte ich mir vorstellen,
dass Windows dich nur auf die Partition auf der SD Karte zugreifen lässt,
weil du die diese öffnest mit \\.\X:
Und die fängt halt bei 251 an. Mal als Theorie.
OpenFile brauchst du dir nicht anzugucken,
die wurde von Microsoft als obsolet erklärt,
wird nicht mehr verwendet. CreateFile ist die neue.
Zurück zur 251:
Folgendes ist eine nicht geprüfte mögliche Lösung.
Ich hab das direkt hier ins Antwortfeld reingeschrieben und nicht getestet.
Zunächst mal brauchst du folgenden Code, kopier den in ein Modul:
Private Declare Function DeviceIoControl Lib "kernel32" ( _
ByVal hDevice As Long, _
ByVal dwIoControlCode As Long, _
ByRef lpInBuffer As Any, _
ByVal nInBufferSize As Long, _
ByRef lpOutBuffer As Any, _
ByVal nOutBufferSize As Long, _
ByRef lpBytesReturned As Long, _
ByRef lpOverlapped As Any) As Long
Private Type STORAGE_DEVICE_NUMBER
DeviceType As Long
DeviceNumber As Long
PartitionNumber As Long
End Type
Private Const IOCTL_STORAGE_GET_DEVICE_NUMBER As Long = &H2D1080
Public Function GetPhysDriveNumber(ByVal hDrv As Long) As Long
Dim udtSDN As STORAGE_DEVICE_NUMBER
Dim lngRet As Long
If DeviceIoControl(hDrv, IOCTL_STORAGE_GET_DEVICE_NUMBER, ByVal _
0&, 0&, udtSDN, Len(udtSDN), lngRet, ByVal 0&) Then
GetPhysDriveNumber = udtSDN.DeviceNumber
Else
GetPhysDriveNumber = -1
End If
End Function CreateFile gibt dir ja ein Handle auf die Partition zurück,
damit du mit Read/WriteFile darin rumwursteln kannst.
Windows erlaubt dir aber auch, auf ein Speichermedium komplett zuzugreifen,
wenn du als Dateiname für CreateFile "\\.\PHYSICALDRIVEX" angibst,
wobei X eine Nummer von 0 bis 9 ist.
Das Problem ist, wie man rausfindet, zu welcher Nummer Partition X gehört.
Zunächst öffnest du also X mit CreateFile über "\\.\X:".
Das Handle, das dir CreateFile zurückgibt, benutzt du, um GetPhysDriveNumber aufzurufen.
Wenn du das hast, schließt du das Handle mit CloseHandle,
um jetzt CreateFile mit "\\.\PHYSICALDRIVE" plus der von GetPhyDriveNumber zurückgegebenen Zahl ein weiteres mal anzufeuern.
Und mit dem Handle müsstest du dich nun frei auf der SD Karte bewegen können.
Hoffentlich klappts. |