/* * DEBUG.CPP * * * * * * */ #include #include #include #include #include #include #include "..\inc\opos.h" #include "oposserv.h" VOID Report(LPSTR szMsg, DWORD num) { char msg[MAX_PATH]; wsprintf((LPSTR)msg, "%s (%xh=%d).", szMsg, num, num); MessageBox((HWND)NULL, (LPSTR)msg, (LPCSTR)"OPOSSERV", MB_OK|MB_ICONEXCLAMATION); } void Test() { HDEVINFO hDevInfo; Report("Test()", 0); hDevInfo = SetupDiGetClassDevs( (LPGUID)&GUID_CLASS_INPUT, // BUGBUG change to POS NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); if (hDevInfo == INVALID_HANDLE_VALUE){ Report("SetupDiGetClassDevs failed", (DWORD)GetLastError()); } else { SP_DEVICE_INTERFACE_DATA deviceData; BOOLEAN enumOk; DWORD memberIndex = 0; deviceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); do { enumOk = SetupDiEnumDeviceInterfaces( hDevInfo, NULL, (LPGUID)&GUID_CLASS_INPUT, memberIndex, &deviceData ); if (enumOk){ CHAR detailBuf[MAX_PATH+1+sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA)] = ""; PSP_DEVICE_INTERFACE_DETAIL_DATA detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)&detailBuf; BOOLEAN getDetailOk; DWORD requiredSize; Report("SetupDiEnumDeviceInterfaces succeeded", 0); detailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); getDetailOk = SetupDiGetDeviceInterfaceDetail( hDevInfo, &deviceData, detailData, sizeof(detailBuf), &requiredSize, NULL ); if (getDetailOk){ HANDLE hFile; Report(detailData->DevicePath, 0); hFile = CreateFile( detailData->DevicePath, GENERIC_READ | GENERIC_WRITE, // | SYNCHRONIZE | FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, // BUGBUG ? LPSECURITY_ATTRIBUTES lpSecurityAttributes, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, // | FILE_FLAG_OVERLAPPED, 0); if (hFile == INVALID_HANDLE_VALUE){ Report("CreateFile failed", (DWORD)GetLastError()); } else { BOOL readOk; PCHAR alignedReadPtr; DWORD bytesRead = 0; // OVERLAPPED overlapped; Report("CreateFile succeeded", 0); #define BUF_SIZE 100000 alignedReadPtr = (PCHAR)VirtualAlloc(NULL, BUF_SIZE, MEM_COMMIT, PAGE_READWRITE); if (alignedReadPtr){ Report("Aligned read ptr is ", (DWORD)alignedReadPtr); do { // RtlZeroMemory(&overlapped, sizeof(OVERLAPPED)); RtlZeroMemory(alignedReadPtr, BUF_SIZE); readOk = ReadFile( hFile, alignedReadPtr, 0x18, // BUGBUG &bytesRead, NULL // &overlapped ); if (readOk){ Report("ReadFile succeeded", bytesRead); } else { DWORD err = (DWORD)GetLastError(); switch (err){ case ERROR_INVALID_FUNCTION: Report("ReadFile: ERROR_INVALID_FUNCTION", err); break; case ERROR_ACCESS_DENIED: Report("ReadFile: ERROR_ACCESS_DENIED", err); break; case ERROR_INSUFFICIENT_BUFFER: Report("ReadFile: ERROR_INSUFFICIENT_BUFFER", err); break; case ERROR_IO_PENDING: Report("ReadFile: ERROR_IO_PENDING", err); break; default: Report("ReadFile failed", err); break; } Report("ReadFile: bytesRead = ", bytesRead); } } while (readOk); VirtualFree(alignedReadPtr, 0, MEM_RELEASE); } else { Report("Memory alloc failed", (DWORD)GetLastError); } CloseHandle(hFile); } } else { Report("SetupDiGetDeviceInterfaceDetail failed", (DWORD)GetLastError()); } // BUGBUG - just look at the first one for now break; } else { DWORD err = GetLastError(); switch (err){ case ERROR_NO_MORE_ITEMS: Report("SetupDiEnumDeviceInterfaces: ERROR_NO_MORE_ITEMS", err); break; default: Report("SetupDiEnumDeviceInterfaces failed", err); break; } } memberIndex++; } while (enumOk); } Report("Test() done", 0); }