コード例 #1
0
ファイル: Asset.cpp プロジェクト: davidswelt/XCSoar
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
}
コード例 #2
0
ファイル: Asset.cpp プロジェクト: DRIZO/xcsoar
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
}