|
|
/**------------------------------------------------------------------
cmtest.c ------------------------------------------------------------------**/
//
// Includes
//
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <wtypes.h>
#include <cfgmgr32.h>
#include <setupapi.h>
#include "cmtest.h"
#include "pnptest.h"
#include <objbase.h>
#include <initguid.h>
#include <winioctl.h>
#include <dbt.h>
#include <pnpmgr.h>
//
// external prototypes
//
CONFIGRET CMP_Init_Detection( IN ULONG ulPrivateID );
CONFIGRET CMP_Report_LogOn( IN ULONG ulPrivateID, IN ULONG ProccesID );
VOID ConnectTest( HWND hWnd );
VOID CallPnPIsaDetect( HWND hDlg, LPTSTR pszDevice );
VOID DumpDeviceChangeData( HWND hWnd, WPARAM wParam, LPARAM lParam );
//
// Private Prototypes
//
//
// Globals
//
HINSTANCE hInst; TCHAR szAppName[] = TEXT("CMTest"); TCHAR szDebug[MAX_PATH]; TCHAR szMachineName[MAX_PATH]; HMACHINE hMachine = NULL;
DEFINE_GUID(FunctionClassGuid1, 0xAAAAAAA1L, 0xE3F0, 0x101B, 0x84, 0x88, 0x00, 0xAA, 0x00, 0x3E, 0x56, 0x01); typedef BOOL (WINAPI *FP_DEVINSTALL)(HWND, LPCWSTR, BOOL, PDWORD);
//
// FROM NTOS\DD\WDM\DDK\INC\HIDCLASS.H
//
DEFINE_GUID( GUID_CLASS_INPUT, 0x4D1E55B2L, 0xF16F, 0x11CF, 0x88, 0xCB, 0x00, \ 0x11, 0x11, 0x00, 0x00, 0x30);
#define GUID_CLASS_INPUT_STR TEXT("4D1E55B2-F16F-11CF-88CB-001111000030")
/**----------------------------------------------------------------------**/ int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MSG msg;
if (!InitApplication(hInstance)) { return FALSE; }
if (!InitInstance(hInstance, nCmdShow)) { return FALSE; }
while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); }
return msg.wParam;
} // WinMain
/**----------------------------------------------------------------------**/ BOOL InitApplication( HINSTANCE hInstance ) { WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon (hInstance, szAppName); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = szAppName; wc.lpszClassName = szAppName;
return RegisterClass(&wc);
} // InitApplication
/**----------------------------------------------------------------------**/ BOOL InitInstance( HINSTANCE hInstance, int nCmdShow ) { HWND hWnd; WORD CMVersion; ULONG CMState = 0; TCHAR szTitle[MAX_PATH];
hInst = hInstance;
CMVersion = CM_Get_Version();
if (CM_Get_Global_State(&CMState, 0) != CR_SUCCESS) { MessageBeep(0); }
wsprintf(szTitle, TEXT("CM API Test Harness - CM State = %x, CM Version %d.%d"), CMState, HIBYTE(CMVersion), LOBYTE(CMVersion));
hWnd = CreateWindow( szAppName, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd) { return FALSE; }
ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd);
return TRUE;
} // InitInstance
/**----------------------------------------------------------------------**/ LRESULT CALLBACK MainWndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { HANDLE hTestFile = NULL; DWORD size = 0; ULONG status, ulType, i; HDEVNOTIFY hDevNotify; HDEVNOTIFY hNotify[64]; HDEVNOTIFY hNotifyDevNode = NULL; HANDLE hFile[64]; DEV_BROADCAST_DEVICEINTERFACE FilterData; DEV_BROADCAST_HANDLE HandleData; BOOL bStatus = TRUE; FP_DEVINSTALL fpDevInstall = NULL; HMODULE hModule = NULL; BOOL bReboot = FALSE; GUID InterfaceGuid; LPTSTR pBuffer, p; TCHAR szDeviceId[MAX_PATH]; DEVNODE dnDevNode; LPBYTE buffer; static ULONG count = 0;
switch (message) { case WM_CREATE: DialogBox(hInst, MAKEINTRESOURCE(CONNECT_DIALOG), hWnd, (DLGPROC)ConnectDlgProc); break;
case WM_DEVICECHANGE: MessageBeep(0); DumpDeviceChangeData(hWnd, wParam, lParam); break;
case WM_COMMAND: switch (LOWORD(wParam)) {
case IDM_CONNECT_TEST: ConnectTest(hWnd); break;
case IDM_DEVICE_LIST: DialogBox(hInst, MAKEINTRESOURCE(DEVLIST_DIALOG), hWnd, (DLGPROC)DeviceListDlgProc); break;
case IDM_SERVICE_LIST: DialogBox(hInst, MAKEINTRESOURCE(SERVICE_DIALOG), hWnd, (DLGPROC)ServiceListDlgProc); break;
case IDM_RELATIONS_LIST: DialogBox(hInst, MAKEINTRESOURCE(RELATIONS_DIALOG), hWnd, (DLGPROC)RelationsListDlgProc); break; case IDM_DEVICE_OPS: DialogBox(hInst, MAKEINTRESOURCE(DEVICE_DIALOG), hWnd, (DLGPROC)DeviceDlgProc); break;
case IDM_DEVNODE_KEY: DialogBox(hInst, MAKEINTRESOURCE(DEVNODEKEY_DIALOG), hWnd, (DLGPROC)DevKeyDlgProc); break;
case IDM_CLASS_LIST: DialogBox(hInst, MAKEINTRESOURCE(CLASS_DIALOG), hWnd, (DLGPROC)ClassDlgProc); break;
case IDM_REGRESSION: DialogBox(hInst, MAKEINTRESOURCE(REGRESSION_DIALOG), hWnd, (DLGPROC)RegressionDlgProc); break;
case IDM_EXIT: DestroyWindow(hWnd); break;
case IDM_INIT_DETECTION: CMP_Init_Detection(0x07020420); break;
case IDM_REPORTLOGON: CMP_Report_LogOn(0x07020420, GetCurrentProcessId()); break;
case IDM_PNPISA_DETECT: CallPnPIsaDetect(hWnd, TEXT("Root\\Device001\\0000")); break;
case IDM_DEVINSTALL: hModule = LoadLibrary(TEXT("newdev.cpl")); if (hModule == NULL) { OutputDebugString(TEXT("LoadLibrary of newdev.cpl failed\n")); break; } if (!(fpDevInstall = (FP_DEVINSTALL)GetProcAddress(hModule, "InstallDevInst"))) { OutputDebugString(TEXT("GetProcAddress failed\n")); break;; } if (!(fpDevInstall)(NULL, L"PnPTest\\Pdo0\\Root&LEGACY_PNPTEST&0000&1111", FALSE, &bReboot)) { OutputDebugString(TEXT("InstallDevInst failed\n")); } FreeLibrary(hModule); break;
//-----------------------------------------------------------
// Notification
//-----------------------------------------------------------
case IDM_REGISTER_NOTIFY: //
// Register for notification on pnptest interface devices
//
#if 0
wsprintf(szDebug, TEXT("CMTEST: Registering window %d for pnptest interface notification\n"), hWnd); OutputDebugString(szDebug);
FilterData.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); FilterData.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; FilterData.dbcc_reserved = 0; memcpy(&FilterData.dbcc_classguid, &FunctionClassGuid1, sizeof(GUID)); FilterData.dbcc_name[0] = 0x0;
hDevNotify = RegisterDeviceNotification(hWnd, &FilterData, DEVICE_NOTIFY_WINDOW_HANDLE); #endif
//
// Register for notification on HID target devices
//
wsprintf(szDebug, TEXT("CMTEST: Registering window %d for hid target notification\n"), hWnd); OutputDebugString(szDebug);
count = 0; pBuffer = malloc(2048 * sizeof(TCHAR)); CM_Get_Device_Interface_List((LPGUID)&GUID_CLASS_INPUT, NULL, pBuffer, 2048, CM_GET_DEVICE_INTERFACE_LIST_PRESENT); for (p = pBuffer; *p; p += lstrlen(p) + 1) { hFile[count] = CreateFile(p, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile[count] != INVALID_HANDLE_VALUE) { wsprintf(szDebug, TEXT(" %s\n"), p); OutputDebugString(szDebug); HandleData.dbch_size = sizeof(DEV_BROADCAST_HANDLE); HandleData.dbch_devicetype = DBT_DEVTYP_HANDLE; HandleData.dbch_reserved = 0; HandleData.dbch_handle = hFile[count]; hNotify[count] = RegisterDeviceNotification(hWnd, &HandleData, DEVICE_NOTIFY_WINDOW_HANDLE); count++; } else { status = GetLastError(); } } free(pBuffer);
//
// Register for notification on storage target devices
//
wsprintf(szDebug, TEXT("CMTEST: Registering window %d for storage target notification\n"), hWnd); OutputDebugString(szDebug);
pBuffer = malloc(2048 * sizeof(TCHAR)); CM_Get_Device_Interface_List((LPGUID)&VolumeClassGuid, NULL, pBuffer, 2048, CM_GET_DEVICE_INTERFACE_LIST_PRESENT); for (p = pBuffer; *p; p += lstrlen(p) + 1) { hFile[count] = CreateFile(p, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile[count] != INVALID_HANDLE_VALUE) { wsprintf(szDebug, TEXT(" %s\n"), p); OutputDebugString(szDebug); HandleData.dbch_size = sizeof(DEV_BROADCAST_HANDLE); HandleData.dbch_devicetype = DBT_DEVTYP_HANDLE; HandleData.dbch_reserved = 0; HandleData.dbch_handle = hFile[count]; hNotify[count] = RegisterDeviceNotification(hWnd, &HandleData, DEVICE_NOTIFY_WINDOW_HANDLE); count++; } else { status = GetLastError(); } } break;
case IDM_UNREGISTER_NOTIFY: #if 0
bStatus = UnregisterDeviceNotification(hDevNotify); #endif
for (i = 0; i < count; i++) { if (hNotify[i]) { bStatus = UnregisterDeviceNotification(hNotify[i]); } if (hFile[i]) { CloseHandle(hFile[i]); } } break;
case IDM_SET_ASSOCIATIONS: hTestFile = CreateFile(L"\\\\.\\PnPTest", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hTestFile == INVALID_HANDLE_VALUE) { status = GetLastError(); } DeviceIoControl(hTestFile, (DWORD)IOCTL_SET, NULL, 0, NULL, 0, &size, NULL); CloseHandle(hTestFile); break;
case IDM_CLEAR_ASSOCIATIONS: hTestFile = CreateFile(L"\\\\.\\PnPTest", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); DeviceIoControl(hTestFile, (DWORD)IOCTL_CLEAR, NULL, 0, NULL, 0, &size, NULL); CloseHandle(hTestFile); break;
case IDM_GET_PROPERTIES: lstrcpy(szDeviceId, TEXT("Root\\LEGACY_PNPTEST\\0000")); UuidFromString(TEXT("aaaaaaa2-e3f0-101b-8488-00aa003e5601"), &InterfaceGuid); pBuffer = malloc(1024); CM_Get_Device_Interface_List(&InterfaceGuid, szDeviceId, pBuffer, 512, CM_GET_DEVICE_INTERFACE_LIST_PRESENT);
// use first returned interface device of that class
hTestFile = CreateFile(pBuffer, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hTestFile == INVALID_HANDLE_VALUE) { status = GetLastError(); } DeviceIoControl(hTestFile, (DWORD)IOCTL_GET_PROP, NULL, 0, NULL, 0, &size, NULL); CloseHandle(hTestFile); CM_Locate_DevNode(&dnDevNode, TEXT("Root\\LEGACY_PNPTEST\\0000"), CM_LOCATE_DEVNODE_NORMAL); buffer = malloc(1024); size = 1024; status = CM_Get_DevNode_Registry_Property(dnDevNode, CM_DRP_BUSTYPEGUID, &ulType, buffer, &size, 0); size = 1024; status = CM_Get_DevNode_Registry_Property(dnDevNode, CM_DRP_LEGACYBUSTYPE, &ulType, buffer, &size, 0); size = 1024; status = CM_Get_DevNode_Registry_Property(dnDevNode, CM_DRP_BUSNUMBER, &ulType, buffer, &size, 0); free(pBuffer); free(buffer); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break;
case WM_DESTROY: if (hMachine != NULL) { CM_Disconnect_Machine(hMachine); } PostQuitMessage(0); break;
default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0;
} // MainWndProc
/**----------------------------------------------------------------------**/ LRESULT CALLBACK ConnectDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { CONFIGRET Status; WORD CMLocalVersion, CMRemoteVersion; ULONG CMState = 0; TCHAR szTitle[MAX_PATH];
switch (message) { case WM_INITDIALOG: CheckRadioButton(hDlg, ID_RAD_LOCAL, ID_RAD_REMOTE, ID_RAD_LOCAL); return TRUE;
case WM_COMMAND: switch(LOWORD(wParam)) {
case ID_RAD_LOCAL: case ID_RAD_REMOTE: CheckRadioButton(hDlg, ID_RAD_LOCAL, ID_RAD_REMOTE, LOWORD(wParam)); break;
case IDOK: if (IsDlgButtonChecked(hDlg, ID_RAD_LOCAL)) { hMachine = NULL; } else { // a NULL machine name just returns local machine handle
GetDlgItemText(hDlg, ID_ED_MACHINE, szMachineName, MAX_PATH); Status = CM_Connect_Machine(szMachineName, &hMachine);
if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Connect_Machine failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); hMachine = NULL; EndDialog(hDlg, FALSE); return TRUE; }
CMLocalVersion = CM_Get_Version(); CMRemoteVersion = CM_Get_Version_Ex(hMachine);
Status = CM_Get_Global_State(&CMState, 0); if (Status != CR_SUCCESS) { MessageBeep(0); }
wsprintf(szTitle, TEXT("CM API Test Harness - CM State = %x, CM Version Local %d.%d, Remote %d.%d"), CMState, HIBYTE(CMLocalVersion), LOBYTE(CMLocalVersion), HIBYTE(CMRemoteVersion), LOBYTE(CMRemoteVersion));
SendMessage(GetParent(hDlg), WM_SETTEXT, 0, (LPARAM)(LPSTR)szTitle);
} EndDialog(hDlg, TRUE); return TRUE;
default: break; }
} return FALSE;
} // ConnectDlgProc
VOID ConnectTest( HWND hWnd ) { CONFIGRET Status = CR_SUCCESS; TCHAR szDeviceID[MAX_DEVICE_ID_LEN], szComputerName[MAX_PATH]; ULONG ulSize = 0; DEVINST dnDevNode; HMACHINE hMachine;
//---------------------------------------------------------------
// 1. Text implicit local machine call
//---------------------------------------------------------------
szDeviceID[0] = 0x0;
Status = CM_Locate_DevNode(&dnDevNode, TEXT("Root\\Device001\\0000"), CM_LOCATE_DEVNODE_NORMAL); if (Status != CR_SUCCESS) { goto Clean0; }
Status = CM_Get_Device_ID(dnDevNode, szDeviceID, MAX_DEVICE_ID_LEN, 0); if (Status != CR_SUCCESS) { goto Clean0; }
if (lstrcmpi(szDeviceID, TEXT("Root\\Device001\\0000")) != 0) { goto Clean0; }
//---------------------------------------------------------------
// 2. Test implicit local machine call using _Ex routines
//---------------------------------------------------------------
szDeviceID[0] = 0x0;
Status = CM_Locate_DevNode_Ex(&dnDevNode, TEXT("Root\\Device001\\0000"), CM_LOCATE_DEVNODE_NORMAL, NULL); if (Status != CR_SUCCESS) { goto Clean0; }
Status = CM_Get_Device_ID_Ex(dnDevNode, szDeviceID, MAX_DEVICE_ID_LEN, 0, NULL); if (Status != CR_SUCCESS) { goto Clean0; }
if (lstrcmpi(szDeviceID, TEXT("Root\\Device001\\0000")) != 0) { goto Clean0; }
//---------------------------------------------------------------
// 3. Test connecting to NULL (local) machine
//---------------------------------------------------------------
Status = CM_Connect_Machine(NULL, &hMachine); if (Status != CR_SUCCESS) { goto Clean0; }
szDeviceID[0] = 0x0;
Status = CM_Locate_DevNode_Ex(&dnDevNode, TEXT("Root\\Device001\\0000"), CM_LOCATE_DEVNODE_NORMAL, hMachine); if (Status != CR_SUCCESS) { goto Clean0; }
Status = CM_Get_Device_ID_Ex(dnDevNode, szDeviceID, MAX_DEVICE_ID_LEN, 0, hMachine); if (Status != CR_SUCCESS) { goto Clean0; }
if (lstrcmpi(szDeviceID, TEXT("Root\\Device001\\0000")) != 0) { goto Clean0; }
Status = CM_Disconnect_Machine(hMachine); if (Status != CR_SUCCESS) { goto Clean0; }
//---------------------------------------------------------------
// 4. Test explicit local machine call
//---------------------------------------------------------------
ulSize = MAX_PATH; GetComputerName(szComputerName, &ulSize);
if (szComputerName[0] != TEXT('\\')) {
TCHAR szTemp[MAX_PATH];
lstrcpy(szTemp, szComputerName); lstrcpy(szComputerName, TEXT("\\\\")); lstrcat(szComputerName, szTemp); }
Status = CM_Connect_Machine(szComputerName, &hMachine); if (Status != CR_SUCCESS) { goto Clean0; }
szDeviceID[0] = 0x0;
Status = CM_Locate_DevNode_Ex(&dnDevNode, TEXT("Root\\Device001\\0000"), CM_LOCATE_DEVNODE_NORMAL, hMachine); if (Status != CR_SUCCESS) { goto Clean0; }
Status = CM_Get_Device_ID_Ex(dnDevNode, szDeviceID, MAX_DEVICE_ID_LEN, 0, hMachine); if (Status != CR_SUCCESS) { goto Clean0; }
if (lstrcmpi(szDeviceID, TEXT("Root\\Device001\\0000")) != 0) { goto Clean0; }
Status = CM_Disconnect_Machine(hMachine); if (Status != CR_SUCCESS) { goto Clean0; }
//---------------------------------------------------------------
// 5. Test remote machine call
//---------------------------------------------------------------
Status = CM_Connect_Machine(TEXT("\\\\PAULAT_PPC1X"), &hMachine); if (Status != CR_SUCCESS) { goto Clean0; }
szDeviceID[0] = 0x0;
Status = CM_Locate_DevNode_Ex(&dnDevNode, TEXT("Root\\Device001\\0000"), CM_LOCATE_DEVNODE_NORMAL, hMachine); if (Status != CR_SUCCESS) { goto Clean0; }
Status = CM_Get_Device_ID_Ex(dnDevNode, szDeviceID, MAX_DEVICE_ID_LEN, 0, hMachine); if (Status != CR_SUCCESS) { goto Clean0; }
if (lstrcmpi(szDeviceID, TEXT("Root\\Device001\\0000")) != 0) { goto Clean0; }
Status = CM_Disconnect_Machine(hMachine); if (Status != CR_SUCCESS) { goto Clean0; }
Clean0:
if (Status == CR_SUCCESS) { MessageBox(hWnd, TEXT("Connect Test Passed"), TEXT("Connect Test"), MB_OK); } else { MessageBox(hWnd, TEXT("Connect Test Failed"), TEXT("Connect Test"), MB_OK); }
return;
} // ConnectTest
BOOL CALLBACK AddPropSheetPageProc( IN HPROPSHEETPAGE hpage, IN LPARAM lParam ) { *((HPROPSHEETPAGE *)lParam) = hpage; return TRUE; }
VOID CallPnPIsaDetect( HWND hDlg, LPTSTR pszDevice ) { HMODULE hLib = NULL; SP_DEVINFO_DATA DeviceInfoData; HDEVINFO hDevInfo; FARPROC PropSheetExtProc; PROPSHEETHEADER PropHeader; HPROPSHEETPAGE hPages[2];
SP_PROPSHEETPAGE_REQUEST PropParams;
#if 0
hLib = LoadLibrary(TEXT("setupapi.dll")); fproc = GetProcAddress(hLib, TEXT("DbgSelectDeviceResources")); Status = (fproc)(pszDevice); FreeLibrary(hLib); #endif
//
// Create a device info element and device info data set.
//
hDevInfo = SetupDiCreateDeviceInfoList(NULL, NULL); if (hDevInfo == INVALID_HANDLE_VALUE) { goto Clean0; }
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); if (!SetupDiOpenDeviceInfo(hDevInfo, pszDevice, NULL, 0, &DeviceInfoData)) { goto Clean0; }
//
// Now get the resource selection page from setupapi.dll
//
if(!(hLib = GetModuleHandle(TEXT("setupapi.dll"))) || !(PropSheetExtProc = GetProcAddress(hLib, "ExtensionPropSheetPageProc"))) {
goto Clean0; }
PropParams.cbSize = sizeof(SP_PROPSHEETPAGE_REQUEST); PropParams.PageRequested = SPPSR_SELECT_DEVICE_RESOURCES; PropParams.DeviceInfoSet = hDevInfo; PropParams.DeviceInfoData = &DeviceInfoData;
if(!PropSheetExtProc(&PropParams, AddPropSheetPageProc, &hPages[0])) { goto Clean0; }
//
// create the property sheet
//
PropHeader.dwSize = sizeof(PROPSHEETHEADER); PropHeader.dwFlags = PSH_PROPTITLE | PSH_NOAPPLYNOW; PropHeader.hwndParent = NULL; PropHeader.hInstance = hInst; PropHeader.pszIcon = NULL; PropHeader.pszCaption = L"Device"; PropHeader.nPages = 1; PropHeader.phpage = hPages; PropHeader.nStartPage = 0; PropHeader.pfnCallback = NULL;
PropertySheet(&PropHeader);
SetupDiDestroyDeviceInfoList(hDevInfo);
Clean0: ;
return;
} // CallPnPIsaDetect
VOID DumpDeviceChangeData( HWND hWnd, WPARAM wParam, LPARAM lParam ) { TCHAR szDbg[MAX_PATH];
OutputDebugString(TEXT("CMTEST: WM_DEVICECHANGE message received\n"));
switch (wParam) { case DBT_DEVICEARRIVAL: OutputDebugString(TEXT(" DBT_DEVICEARRIVAL event\n")); break;
case DBT_DEVICEREMOVECOMPLETE: OutputDebugString(TEXT(" DBT_DEVICEREMOVECOMPLETE event\n")); break;
case DBT_DEVICEQUERYREMOVE: OutputDebugString(TEXT(" DBT_DEVICEQUERYREMOVE event\n")); break;
case DBT_DEVICEQUERYREMOVEFAILED: OutputDebugString(TEXT(" DBT_DEVICEQUERYREMOVEFAILED event\n")); break;
case DBT_DEVICEREMOVEPENDING: OutputDebugString(TEXT(" DBT_DEVICEREMOVEPENDING event\n")); break;
case DBT_DEVICETYPESPECIFIC: OutputDebugString(TEXT(" DBT_DEVICETYPESPECIFIC event\n")); break;
case DBT_CUSTOMEVENT: OutputDebugString(TEXT(" DBT_CUSTOMEVENT event\n")); break;
default: break;
}
switch (((PDEV_BROADCAST_HDR)lParam)->dbch_devicetype) { case DBT_DEVTYP_DEVICEINTERFACE: { PDEV_BROADCAST_DEVICEINTERFACE p = (PDEV_BROADCAST_DEVICEINTERFACE)lParam; LPTSTR pString; OutputDebugString(TEXT(" DBT_DEVTYP_DEVICEINTERFACE\n")); wsprintf(szDbg, TEXT(" %s\n"), p->dbcc_name); OutputDebugString(szDbg); UuidToString(&p->dbcc_classguid, &pString); wsprintf(szDbg, TEXT(" %s\n"), pString); OutputDebugString(szDbg); break; } case DBT_DEVTYP_HANDLE: OutputDebugString(TEXT(" DBT_DEVTYP_HANDLE\n")); break;
default: break; }
wsprintf(szDbg, TEXT(" wParam = %d\n")); OutputDebugString(szDbg);
} // DumpDeviceChangeData
|