DeviceIoControl(..., FSCTL_LOCK_VOLUME,...); Issue



  • Ich möchte ein Volume sperren (USB), aber ich erhalte immer eine ERROR_INVALID_HANDLE Fehlermeldung

    HANDLE hDev = CreateFile(
    	"\\\\.\\E:",
    	0,
    	(FILE_SHARE_READ | FILE_SHARE_WRITE),
    	NULL,
    	OPEN_EXISTING,
    	FILE_FLAG_OVERLAPPED,
    	NULL
    	);
    
    if (hDev == INVALID_HANDLE_VALUE)
    {
    	cout << "CreateFile() failed!" << endl;
    	cout << "GetLastError(): " << GetLastError() << endl;
    	return -1;
    }
    DWORD bytesReturned;
    OVERLAPPED overlapped;
    
    BOOL retDevIoCtrl = DeviceIoControl(
    	hDev,              // handle to a volume
    	FSCTL_LOCK_VOLUME, // dwIoControlCode
    	NULL,              // lpInBuffer
    	0,                 // nInBufferSize
    	NULL,              // lpOutBuffer
    	0,                 // nOutBufferSize
    	&bytesReturned,    // number of bytes returned
    	&overlapped        // OVERLAPPED structure
    );
    if (!retDevIoCtrl)
    {
    	cout << "FSCTL_LOCK_VOLUME failed!" << endl;
    	cout << "GetLastError(): " << GetLastError() << endl;
    

    Der Output ist immer " FSCTL_LOCK_VOLUME failed! GetLastError(): 6 "

    Ich habe schon ein paar Variationen der CreateFile Parameter versucht, aber bisher konnte ich keine Lösung finden. Vielleicht kann jemand helfen? Benutze ich die falschen Parameter? So weit ich das erkennen kann, benutze ich sie, wie in der MSDN Dokumentation angegeben.

    Vielen Dank
    Nico



  • Schauen wir doch mal nach, was Fehlercode 6 bedeutet...

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382.aspx

    MSDN schrieb:

    the handle is invalid

    aha!



  • Den Teil, wo du das Event-Handle in der OVERLAPPED-Struktur setzt, hast du weggelassen?



  • dot schrieb:

    Schauen wir doch mal nach, was Fehlercode 6 bedeutet...

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382.aspx

    MSDN schrieb:

    the handle is invalid

    aha!

    Wer lesen kann...

    Kronos_m schrieb:

    erhalte immer eine ERROR_INVALID_HANDLE Fehlermeldung

    Genau das war die Frage, warum ist das Hanle invalid und nicht was Error Code 6 bedeutet!

    @MFK
    Danke für den Hinweis! Habe jetzt folgenden Teil dazwischen geschoben:

    DWORD bytesReturned;
    OVERLAPPED overlapped;
    ZeroMemory(&overlapped, sizeof(OVERLAPPED));
    
    HANDLE hEvent = CreateEvent(
    	NULL,
    	FALSE,
    	FALSE,
    	NULL
    );
    if (!hEvent)
    {
    	cout << "CreateEvent failed!" << endl;
    	cout << "GetLastError(): " << GetLastError() << endl;
    	return -1;
    }
    
    overlapped.hEvent = hEvent;
    

    Nun ist der output jedoch:
    `

    FSCTL_LOCK_VOLUME failed!

    GetLastError(): 1

    `
    Und ja, nur für den Fall der Fälle 😃 ich weiß, dass das "Incorrect function" bedeutet, nur warum 😕



  • Danke noch mal an MFK!

    Beispiel geht nun! Hab den dwDesiredAccess von CreateFile() nun noch auf (GENERIC_READ | GENERIC_WRITE) gesetzt: Et voilà!


Log in to reply