Hallo Profis,
ich wende mich an euch, da ich in Google nun schon die ersten 3-5 Seiten zu jeder erdenklichen Fragestellung in diese Richtung abgearbeitet habe und nicht die Problemlösung finden konnte.
Ich möchte direkt auf ein USB Laufwerk schreiben und dafür die Windows APIs (CreateFie WriteFile und ReadFile) verwenden.
CreateFie: Scheint zu funktionieren und gibt mir brav ein Handel auf das gewünschte Laufwerk.
WriteFile und ReadFile: Sind beim besten Willen nicht dazu zu bewegen, das zu machen wofür Microsoft sie geschrieben hat.
Ich habe Windows 7 (x64) dies könnte ein Grund für das Problem sein, da einige Alte Codes auf wohl früheren Betriebssystemen wenn man den Postern glauben schenken darf Funktionieren.
Nun habe ich schon folgendes Versucht:
- Handel nicht über Buchstabe sondern über:
'\\.\G:
'C:\Test\myfile.text
'USB\VID_058F&PID_6387\58CC7397
'\\.\PHYSICALDRIVE1
'\\.\G:\test.avl
'\\?\Volume{03755169-c62d-11e2-bd6b-001e9086f6bc}\
- Laufwerk entmounten, Laufwerk sperren, Laufwerk auswerfen. (Da in Tipp dies als Lösung versprochen hat)
- Schreiben auf File \\.\G\test.txt
- Schreiben auf C: (vlt liegt es ja am USB-Controller)
- Diverse andere Schreibweisen der APIs (aus Verzweiflung)
- Lesen aller Spezifikationen aller verwendeter Funktionen
Nichts davon hat
geholfen, deswegen brauche ich den Spezialisten, der mir sagen kann wo das
Problem ist und ob man es lösen kann. Ich suche hier eine konkrete Antwort auf
genau diese APIs und nicht benutz doch einfach (My.Computer.FileSystem.WriteAllText()) in einem früheren Problem
hat sich das nämlich als nicht verwendbar für meine Zwecke herausgestellt.
Hier Der Quellcode:
Keine Sorge, das Meiste ist API Deklaration! habs nur der Vollständigkeit halber angehängt um ein einfaches Testen zu ermöglichen, falls jemand eine SUPER Idee hat.
Danke schon mal! ich hoffe auf eine gute Diskussion![:)](https://www.vb-paradise.de/wcf/images/smilies/smile.png)
ich wende mich an euch, da ich in Google nun schon die ersten 3-5 Seiten zu jeder erdenklichen Fragestellung in diese Richtung abgearbeitet habe und nicht die Problemlösung finden konnte.
Ich möchte direkt auf ein USB Laufwerk schreiben und dafür die Windows APIs (CreateFie WriteFile und ReadFile) verwenden.
CreateFie: Scheint zu funktionieren und gibt mir brav ein Handel auf das gewünschte Laufwerk.
WriteFile und ReadFile: Sind beim besten Willen nicht dazu zu bewegen, das zu machen wofür Microsoft sie geschrieben hat.
Ich habe Windows 7 (x64) dies könnte ein Grund für das Problem sein, da einige Alte Codes auf wohl früheren Betriebssystemen wenn man den Postern glauben schenken darf Funktionieren.
Nun habe ich schon folgendes Versucht:
- Handel nicht über Buchstabe sondern über:
'\\.\G:
'C:\Test\myfile.text
'USB\VID_058F&PID_6387\58CC7397
'\\.\PHYSICALDRIVE1
'\\.\G:\test.avl
'\\?\Volume{03755169-c62d-11e2-bd6b-001e9086f6bc}\
- Laufwerk entmounten, Laufwerk sperren, Laufwerk auswerfen. (Da in Tipp dies als Lösung versprochen hat)
- Schreiben auf File \\.\G\test.txt
- Schreiben auf C: (vlt liegt es ja am USB-Controller)
- Diverse andere Schreibweisen der APIs (aus Verzweiflung)
- Lesen aller Spezifikationen aller verwendeter Funktionen
Nichts davon hat
geholfen, deswegen brauche ich den Spezialisten, der mir sagen kann wo das
Problem ist und ob man es lösen kann. Ich suche hier eine konkrete Antwort auf
genau diese APIs und nicht benutz doch einfach (My.Computer.FileSystem.WriteAllText()) in einem früheren Problem
hat sich das nämlich als nicht verwendbar für meine Zwecke herausgestellt.
Hier Der Quellcode:
Keine Sorge, das Meiste ist API Deklaration! habs nur der Vollständigkeit halber angehängt um ein einfaches Testen zu ermöglichen, falls jemand eine SUPER Idee hat.
Danke schon mal! ich hoffe auf eine gute Diskussion
![:)](https://www.vb-paradise.de/wcf/images/smilies/smile.png)
VB.NET-Quellcode
- Private Const GENERIC_READ As Integer = &H80000000
- Private Const GENERIC_WRITE As Integer = &H40000000
- 'Private Const OPEN_EXISTING As Integer = 3
- Private Const OPEN_ALWAYS As Integer = 4
- Private Const FILE_SHARE_READ As Integer = 1
- Private Const FILE_SHARE_WRITE As Integer = 2
- Private Const INVALID_HANDLE_VALUE As Integer = -1
- 'Private Const FSCTL_LOCK_VOLUME As Integer = &H90018
- 'Private Const FSCTL_DISMOUNT_VOLUME As Integer = &H90020
- 'Private Const IOCTL_STORAGE_MEDIA_REMOVAL As Integer = &H2D4804
- 'Private Const IOCTL_STORAGE_EJECT_MEDIA As Integer = &H2D4808
- 'Private Const IOCTL_STORAGE_LOAD_MEDIA As Integer = &H2D480C
- 'Private Const FSCTL_ALLOW_EXTENDED_DASD_IO As Integer = &H9000C
- Private Const FILE_FLAG_NO_BUFFERING As Integer = &H20000000
- Private Const FILE_FLAG_WRITE_THROUGH As Integer = &H80000000
- Private Const FILE_BEGIN = 0
- Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" ( _
- ByVal lpFileName As String, _
- ByVal dwDesiredAccess As Int32, _
- ByVal dwShareMode As Int32, _
- ByVal lpSecurityAttributes As IntPtr, _
- ByVal dwCreationDisposition As Int32, _
- ByVal dwFlagsAndAttributes As Int32, _
- ByVal hTemplateFile As IntPtr _
- ) As IntPtr
- Private Declare Function SetFilePointer Lib "kernel32" ( _
- ByVal hFile As IntPtr, _
- ByVal lDistanceToMove As Int32, _
- ByRef lpDistanceToMoveHigh As Int32, _
- ByVal dwMoveMethod As Int32 _
- ) As Int32
- Private Declare Function ReadFile Lib "kernel32" ( _
- ByVal hFile As IntPtr, _
- ByRef lpBuffer As IntPtr, _
- ByVal nNumberOfBytesToRead As Int32, _
- ByRef lpNumberOfBytesRead As Int32, _
- ByRef lpOverlapped As IntPtr _
- ) As Int32
- Private Declare Unicode Function LockFile Lib "kernel32" ( _
- ByVal handle As IntPtr, _
- ByVal offsetLow As Int32, _
- ByVal offsetHigh As Int32, _
- ByVal countLow As Int32, _
- ByVal countHigh As Int32 _
- ) As Int32
- Private Declare Function UnlockFile Lib "kernel32" ( _
- ByVal hFile As IntPtr, _
- ByVal dwFileOffsetLow As Int32, _
- ByVal dwFileOffsetHigh As Int32, _
- ByVal nNumberOfBytesToUnlockLow As Int32, _
- ByVal nNumberOfBytesToUnlockHigh As Int32 _
- ) As Int32
- Private Declare Function WriteFile Lib "kernel32" ( _
- ByVal hFile As IntPtr, _
- lpBuffer As IntPtr, _
- ByVal nNumberOfBytesToWrite As Int32, _
- lpNumberOfBytesWritten As Int32, _
- ByVal lpOverlapped As IntPtr _
- ) As Int32
- Private Declare Function FlushFileBuffers Lib "kernel32" ( _
- ByVal hFile As IntPtr _
- ) As Int32
- Private Declare Function CloseHandle Lib "kernel32" ( _
- ByVal hObject As IntPtr _
- ) As Int32
- Sub MyProblem()
- Dim hDevice As IntPtr, retVal As Long, BytesWritten As Long
- Dim mybytes(512) As Byte
- Dim MY_SECURITY_ATTRIBUTE As IntPtr
- Static ovlRead As IntPtr = Nothing
- Dim nRead As Long
- hDevice = CreateFile("\\.\G:", _
- GENERIC_READ Or GENERIC_WRITE, _
- FILE_SHARE_READ Or FILE_SHARE_WRITE, _
- MY_SECURITY_ATTRIBUTE, _
- OPEN_ALWAYS, _
- FILE_FLAG_NO_BUFFERING, _
- Nothing)
- If hDevice = INVALID_HANDLE_VALUE Then Exit Sub
- 'Call DeviceIoControl(hDevice, FSCTL_DISMOUNT_VOLUME, Nothing, 0, Nothing, 0, lpBuffer, Nothing)
- 'Call DeviceIoControl(hDevice, FSCTL_LOCK_VOLUME, Nothing, 0, Nothing, 0, lpBuffer, Nothing)
- 'Call DeviceIoControl(hDevice, IOCTL_STORAGE_EJECT_MEDIA, Nothing, 0, Nothing, 0, lpBuffer, Nothing)
- 'Call DeviceIoControl(hDevice, FSCTL_ALLOW_EXTENDED_DASD_IO, Nothing, 0, Nothing, 0, lpBuffer, Nothing)
- Dim R As New System.Random
- R.NextBytes(mybytes)
- 'Pointer auf Sektor 100
- retVal = SetFilePointer(hDevice, 100 * 512, Nothing, FILE_BEGIN)
- 'Schreiben
- retVal = LockFile(hDevice, 100 * 512, 0, 512, 0)
- retVal = WriteFile(hDevice, mybytes(0), 512, nRead, ovlRead)
- retVal = FlushFileBuffers(hDevice)
- retVal = UnlockFile(hDevice, 100 * 512, 0, 512, 0)
- 'Lesen
- retVal = ReadFile(hDevice, mybytes(0), 512, nRead, Nothing)
- Call CloseHandle(hDevice) End Sub