vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
SEPA-Dateien erstellen inkl. IBAN-, BLZ-/Kontonummernprüfung  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Visual-Basic Einsteiger
Re: Sektoren einer SD-Karte beschreiben (ohne Dateisystem) 
Autor: Majuz
Datum: 18.06.09 08:16

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
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Sektoren einer SD-Karte beschreiben (ohne Dateisystem)5.478Majuz12.06.09 13:12
Re: Sektoren einer SD-Karte beschreiben (ohne Dateisystem)3.812Majuz13.06.09 00:28
Re: Sektoren einer SD-Karte beschreiben (ohne Dateisystem)3.663Majuz14.06.09 00:20
Re: Sektoren einer SD-Karte beschreiben (ohne Dateisystem)3.504Majuz14.06.09 22:38
Re: Sektoren einer SD-Karte beschreiben (ohne Dateisystem)3.636Majuz15.06.09 17:35
Re: Sektoren einer SD-Karte beschreiben (ohne Dateisystem)3.437Majuz16.06.09 20:40
Re: Sektoren einer SD-Karte beschreiben (ohne Dateisystem)3.531Arne Elster16.06.09 22:00
Re: Sektoren einer SD-Karte beschreiben (ohne Dateisystem)3.497Arne Elster16.06.09 22:30
Re: Sektoren einer SD-Karte beschreiben (ohne Dateisystem)3.538Majuz17.06.09 17:54
Re: Sektoren einer SD-Karte beschreiben (ohne Dateisystem)3.436Majuz18.06.09 08:16
Re: Sektoren einer SD-Karte beschreiben (ohne Dateisystem)3.425Majuz18.06.09 21:20
Re: Sektoren einer SD-Karte beschreiben (ohne Dateisystem)3.382Majuz16.06.09 08:22
Re: Sektoren einer SD-Karte beschreiben (ohne Dateisystem)3.475Agrypnie21.06.09 08:08
Re: Sektoren einer SD-Karte beschreiben (ohne Dateisystem)3.566Majuz21.06.09 10:47
Re: Sektoren einer SD-Karte beschreiben (ohne Dateisystem)2.727NormBot05.03.13 22:48

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel