WM_DEVICECHANGE: Zumachen, wenn usb-stick entfernt wird



  • Hallo Leute.

    Wie der Titel sagt, möchte ich meine exe, die von autorun.inf von usb-stick gestartet wird, schließen, wenn der stick entfernt werden soll.

    LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	static HANDLE hModuleFile;
    
    	PDEV_BROADCAST_HDR deviceHDR;
    	PDEV_BROADCAST_HANDLE deviceHandle;
    
    	switch (uMsg)
    	{
    	case WM_CREATE:
    		// diese funktion öffnet ein Handle von CreateFile, dass von GetModuleFileName(0) kommt
    		hModuleFile = GetModuleHandle(0);
    
    		deviceHandle->dbch_handle = hModuleFile;
    		deviceHandle->dbch_devicetype = DBT_DEVTYP_HANDLE;
    		RegisterDeviceNotification(hWnd, deviceHandle, DEVICE_NOTIFY_WINDOW_HANDLE);
    
    		return 0;
    	case WM_DESTROY:
    		CloseHandle(hModuleFile);
    		PostQuitMessage(0);
    		return 0;
    	case WM_DEVICECHANGE:
    		switch (wParam)
    		{
    		case DBT_DEVICEQUERYREMOVE:
    			deviceHDR = (PDEV_BROADCAST_HDR)lParam;
    			if (deviceHDR->dbch_devicetype == DBT_DEVTYP_HANDLE)
    				// die exe soll geschlossen werden
    				// also zum test piepen
    				Beep(440, 1000);
    				// aber bei meinen Tests piepte er net...
    			return 0;
    		}
    		return 0;
    	default:
    		return DefWindowProc(hWnd, uMsg, wParam, lParam);
    	}
    }
    
    HANDLE OpenModuleHandle(HMODULE hModule)
    {
    	WCHAR fileName[MAX_PATH + 1];
    	GetModuleFileName(hModule, fileName, MAX_PATH);
    
    	return CreateFile(fileName,
    					  GENERIC_READ,
    					  FILE_SHARE_READ,
    					  NULL,
    					  OPEN_EXISTING,
    					  FILE_ATTRIBUTE_NORMAL,
    					  NULL);
    }
    

    Was könnte daran falsch sein?

    Den Code habe ich von MSDN:
    http://msdn2.microsoft.com/en-us/library/aa363427(VS.85).aspx

    Vielen Dank für eure Hilfe!!! 🙂



  • Ich weiß jetzt nicht direkt, was daran nicht funktioniert, aber kann es sein, dass in PDEV_BROADCAST_HANDLE deviceHandle; ein Fehler liegt? Das müsste doch ein Zeiger auf die DEV_BROADCAST_HANDLE-Struktur sein, der Zeiger ist aber uninitialisiert. Evtl direkt eine Instanz von DEV_BROADCAST_HANDLE erstellen und bei RegisterDeviceNotification einen Zeiger darauf übergeben?



  • bei der msdn stand das auch so. (siehe link)

    welche fehler seht ihr noch?

    Könnt ihr den verbesserten code posten?


Anmelden zum Antworten