static bool ReadCompaqID() { #if defined(_WIN32_WCE) PROCESS_INFORMATION pi; if (CreateProcess(_T("\\windows\\CreateAssetFile.exe"), NULL, NULL, NULL, FALSE, 0, NULL, NULL, NULL, &pi)) { WaitForSingleObject(pi.hProcess, 1000); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } FileHandle file(_T("\\windows\\cpqAssetData.dat"), _T("rb")); if (!file.IsOpen() || !file.Seek(976, SEEK_SET)) return false; TCHAR buffer[ARRAY_SIZE(asset_number)]; size_t length = file.Read(buffer, ARRAY_SIZE(buffer) - 1, sizeof(buffer[0])); buffer[length] = _T('\0'); return SetAssetNumber(buffer); #else return false; #endif }
static bool ReadUUID() { #if defined(IOCTL_HAL_GET_DEVICEID) && defined(FILE_DEVICE_HAL) BOOL fRes; #define GUIDBuffsize 100 unsigned char GUIDbuffer[GUIDBuffsize]; int eLast = 0; int i; unsigned long uNumReturned=0; int iBuffSizeIn=0; unsigned long temp, Asset; GUID Guid; // approach followed: http://blogs.msdn.com/jehance/archive/2004/07/12/181116.aspx // 1) send 16 byte buffer - some older devices need this // 2) if buffer is wrong size, resize buffer accordingly and retry // 3) take first 16 bytes of buffer and process. Buffer returned may be any size // First try exactly 16 bytes, some older PDAs require exactly 16 byte buffer asset_number[0]= '\0'; iBuffSizeIn = sizeof(Guid); memset(GUIDbuffer, 0, iBuffSizeIn); fRes = KernelIoControl(IOCTL_HAL_GET_DEVICEID, 0, 0, GUIDbuffer, iBuffSizeIn, &uNumReturned); if(fRes == false) { // try larger buffer eLast = GetLastError(); if (ERROR_INSUFFICIENT_BUFFER != eLast) return false; else { // wrong buffer iBuffSizeIn = uNumReturned; memset(GUIDbuffer, 0, iBuffSizeIn); fRes = KernelIoControl(IOCTL_HAL_GET_DEVICEID, 0, 0, GUIDbuffer, iBuffSizeIn, &uNumReturned); eLast = GetLastError(); if(fRes == false) return false; } } // here assume we have data in GUIDbuffer of length uNumReturned memcpy(&Guid, GUIDbuffer, sizeof(Guid)); temp = Guid.Data2; temp = temp << 16; temp += Guid.Data3; Asset = temp ^ Guid.Data1; temp = 0; for(i = 0; i < 4; i++) { temp = temp << 8; temp += Guid.Data4[i]; } Asset = Asset ^ temp; temp = 0; for(i = 0; i < 4; i++) { temp = temp << 8; temp += Guid.Data4[i + 4]; } Asset = Asset ^ temp; TCHAR buffer[20]; _stprintf(asset_number, _T("%08X%08X"), Asset, Guid.Data1); return SetAssetNumber(buffer); #else return false; #endif }