Zitat von
himitsu:
Da bleibt wohl doch die frage, ob dieser Wert wirklich FSCTL_MOUNT_VOLUME ntspricht ... könnte ja auch was ganz anderes sein
hast es auch schonmal mit FILE_FLAG_NO_BUFFERING versuchen?
S. [1]
Mein immer stärker werdender Verdacht geht in Richtung "Bug in Firmware", denn:
So lange das USB-Gerät die Log-Datei selbst nicht verändert, kann ich von meinem Programm aus das Gerät zigmal Dismounten und wieder Mounten. Klappt (jetzt) auch ohne Debug-Modus einwandfrei[1].
Wenn aber das USB-Gerät die Log-Datei verändert und ich dann das Gerät (dis-)mounten, stürzt es so gnadenlos ab, dass es nur noch durch Strom aus/an wieder belebt werden kann.
Gruß, Carsten
[1]
Delphi-Quellcode:
const
//Konstanten für Volume Funktionen
METHOD_BUFFERED = 0;
{$EXTERNALSYM METHOD_BUFFERED}
FILE_ANY_ACCESS = 0;
{$EXTERNALSYM FILE_ANY_ACCESS}
FILE_DEVICE_FILE_SYSTEM = $00000009;
{$EXTERNALSYM FILE_DEVICE_FILE_SYSTEM}
FSCTL_LOCK_VOLUME = (FILE_DEVICE_FILE_SYSTEM shl 16) or (FILE_ANY_ACCESS shl 14) or (6 shl 2)
or METHOD_BUFFERED;
{$EXTERNALSYM FSCTL_LOCK_VOLUME}
FSCTL_UNLOCK_VOLUME = ((FILE_DEVICE_FILE_SYSTEM shl 16) or (FILE_ANY_ACCESS shl 14) or (7 shl 2)
or METHOD_BUFFERED);
{$EXTERNALSYM FSCTL_UNLOCK_VOLUME}
FSCTL_DISMOUNT_VOLUME = ((FILE_DEVICE_FILE_SYSTEM shl 16) or (FILE_ANY_ACCESS shl 14) or (8 shl 2)
or METHOD_BUFFERED);
FSCTL_MOUNT_VOLUME = ((FILE_DEVICE_FILE_SYSTEM shl 16) or (FILE_ANY_ACCESS shl 14) or (9 shl 2)
or METHOD_BUFFERED);
(...)
hDrive := CreateFile('\\.\X:',
GENERIC_READ (*or GENERIC_WRITE*),
FILE_SHARE_READ (*or FILE_SHARE_WRITE*),
nil, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, 0);
if hDrive <> INVALID_HANDLE_VALUE then
begin
DeviceIoControl(hDrive, FSCTL_DISMOUNT_VOLUME, nil, 0, nil, 0, W, nil);
Delay(100);
DeviceIoControl(hDrive, FSCTL_MOUNT_VOLUME, nil, 0, nil, 0, W, nil);
Delay(100);
CloseHandle(hDrive);
Delay(600);
end;