Hi,
Ich hab jetzt mal versucht das Programm zu verstehen.
Diese zwei Funktionen sind wohl die wichtigsten für meinen Fall:
Private Function DirectReadDriveNT(ByVal sDrive As String, ByVal iStartSec As _
Long, ByVal iOffset As Long, ByVal cBytes As Long) As Variant
Dim hDevice As Long
Dim abBuff() As Byte
Dim abResult() As Byte
Dim nSectors As Long
Dim nRead As Long
nSectors = Int((iOffset + cBytes - 1) / BytesPerSector) + 1
hDevice = CreateFile("\\.\" & UCase(Left(sDrive, 1)) & ":", GENERIC_READ Or _
GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, _
0&, 0&)
If hDevice = INVALID_HANDLE_VALUE Then Exit Function
Call SetFilePointer(hDevice, iStartSec * BytesPerSector, 0, FILE_BEGIN)
ReDim abResult(cBytes - 1)
ReDim abBuff(nSectors * BytesPerSector - 1)
Call ReadFile(hDevice, abBuff(0), UBound(abBuff) + 1, nRead, 0&)
CloseHandle hDevice
CopyMemory abResult(0), abBuff(iOffset), cBytes
DirectReadDriveNT = abResult
End Function
Private Function DirectWriteDriveNT(ByVal sDrive As String, ByVal iStartSec As _
Long, ByVal iOffset As Long, ByVal sWrite As String) As Boolean
Dim hDevice As Long
Dim abBuff() As Byte
Dim ab() As Byte
Dim nRead As Long
Dim nSectors As Long
nSectors = Int((iOffset + Len(sWrite) - 1) / BytesPerSector) + 1
hDevice = CreateFile("\\.\" & UCase(Left(sDrive, 1)) & ":", GENERIC_READ Or _
GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, _
0&, 0&)
If hDevice = INVALID_HANDLE_VALUE Then Exit Function
abBuff = DirectReadDriveNT(sDrive, iStartSec, 0, nSectors * BytesPerSector)
ab = StrConv(sWrite, vbFromUnicode)
CopyMemory abBuff(iOffset), ab(0), Len(sWrite)
Call SetFilePointer(hDevice, iStartSec * BytesPerSector, 0, FILE_BEGIN)
Call LockFile(hDevice, LoWord(iStartSec * BytesPerSector), HiWord(iStartSec _
* BytesPerSector), LoWord(nSectors * BytesPerSector), HiWord(nSectors * _
BytesPerSector))
DirectWriteDriveNT = WriteFile(hDevice, abBuff(0), UBound(abBuff) + 1, _
nRead, 0&)
Call FlushFileBuffers(hDevice)
Call UnlockFile(hDevice, LoWord(iStartSec * BytesPerSector), HiWord( _
iStartSec * BytesPerSector), LoWord(nSectors * BytesPerSector), HiWord( _
nSectors * BytesPerSector))
CloseHandle hDevice
End Function Eigentlich sogar nur die Untere ("DirectWriteDriveNT")
Wenn ich es richtig verstanden habe macht die folgendees:
- Ein Handle erzeugen mit in meinem Fall "\\.\e:" (ist genau so wie ich es hatte)
- in abBuff den Sektor (oder die Sektoren) der geschrieben werden soll einlesen (mittels der Funktion darüber)
- Was das hier "ab = StrConv(sWrite, vbFromUnicode)" macht hab ich nicht kapiert, aber glaube nicht dass das so wichtig ist
- Dann wird der zu schreibende String in das vorher ausgelesene an der richtigen Prosition eingefügt.
- Der Filepointer wird auf die Stelle gesetzt an der geschrieben werden soll (hab ich genauso gemacht)
- LockFile wird aufgerufen (hierzu finde ich keine richtige Beschreibung was die API macht. Auf der Seite die ich oben angegeben habe wird die API zwar erwähnt, aber es fehlt jede Beschreibung)
- WriteFile wird ausgeführt (Wie ich es auch gemacht habe)
- FlushFileBuffers(hDevice): damit wird wahrscheinlich der Zwischenpuffer gelehrt (was bringt das??)
- Dann wird die Datei wieder "ungelockt" (auch hierzu hab ich keine Infos gefunden )
- Am Ende wird das Handle wieder geschossen.
Zusammenfassend kann man sagen:
bis auf diese Zeilen:
Call LockFile(hDevice, LoWord(iStartSec * BytesPerSector), HiWord(iStartSec _
* BytesPerSector), LoWord(nSectors * BytesPerSector), HiWord(nSectors * _
BytesPerSector))
[....]
Call FlushFileBuffers(hDevice)
Call UnlockFile(hDevice, LoWord(iStartSec * BytesPerSector), HiWord( _
iStartSec * BytesPerSector), LoWord(nSectors * BytesPerSector), HiWord( _
nSectors * BytesPerSector)) ist alles genau so wie ich es hatte. Was bewirken diese 3 Zeilen? Ich hatte gestern abend keine Zeit mehr zu probieren was passiert wenn ich diese Zeilen einfüge und jetzt bin ich bei der Arbeit. Falls es dann funktioniert wüsste ich aber auch gerne wieso.
Gruß
Marius |