Где я могу получить pkfuncs.h (и доступ к KernelIoControl)? - PullRequest
1 голос
/ 06 сентября 2011

Я пытаюсь вызвать KernelIoControl , но нигде не могу найти файл заголовка pkfuncs.h.

Мне интересно, если: а) мне нужна секретная загрузка?б) Или его нет, потому что используемый мной SDK устройства (Casio) не включает эти библиотеки?

Кроме того ... предположительно, это WINAPI?Я думаю, что я просто буду динамически связываться с ним.

Ответы [ 3 ]

1 голос
/ 06 сентября 2011

Вам не нужен заголовок для вызова KernelIoControl.Просто добавьте это в свое приложение:

extern "C" BOOL KernelIoControl(
  DWORD dwIoControlCode,
  LPVOID lpInBuf,
  DWORD nInBufSize,
  LPVOID lpOutBuf,
  DWORD nOutBufSize,
  LPDWORD lpBytesReturned
);

Компоновщик найдет его для вас.

0 голосов
/ 10 сентября 2011

Вот код, который я использую, чтобы получить уникальный идентификатор устройства:

PDWORD      pdwTmp;
DWORD       dwUIDLen;
DWORD       dwLen;
DWORD       dwIdx;
BYTE        abData[512];
BYTE        abID[64];
PDEVICE_ID  pDvcID;

dwLen = 0;
memset(abID, 0, sizeof(abID));
memset(abData, 0, sizeof(abData));
pDvcID = (PDEVICE_ID) abData;
pDvcID->dwSize = sizeof(abData);
KernelIoControl(IOCTL_HAL_GET_DEVICEID, NULL, 0, abData, sizeof(abData), &dwLen);
// If valid data was returned build ID from both parts
if ( (dwLen >= (sizeof(*pDvcID) + 8))       // Enough bytes returned for struct and 8 ID bytes
    && (dwLen >= pDvcID->dwSize)            // Bytes returned is at least indicated struct size
    && pDvcID->dwPresetIDBytes && pDvcID->dwPlatformIDBytes     // Both ID's are present
    && (pDvcID->dwPresetIDOffset >= sizeof(*pDvcID))            // Preset ID offset is reasonable
    && (pDvcID->dwPlatformIDOffset >= sizeof(*pDvcID))          // Platform ID offset is reasonable
    && ((pDvcID->dwPresetIDOffset + pDvcID->dwPresetIDBytes)    // Preset ID is in bounds
        <= pDvcID->dwSize)
    && ((pDvcID->dwPlatformIDOffset + pDvcID->dwPlatformIDBytes)// Platform ID is in bounds
        <= pDvcID->dwSize) )
{
    // Copy as much of the Preset ID as will fit
    dwIdx = pDvcID->dwPresetIDBytes;
    if ( dwIdx > sizeof(abID) )
        dwIdx = sizeof(abID);
    if ( dwIdx )
        memcpy(abID, abData + pDvcID->dwPresetIDOffset, dwIdx);
    dwLen = dwIdx;
    // Copy as much of the Platform ID as will fit
    dwIdx = pDvcID->dwPlatformIDBytes;
    if ( dwIdx > (sizeof(abID) - dwLen) )
        dwIdx = (sizeof(abID) - dwLen);
    if ( dwIdx )
        memcpy(abID + dwLen, abData + pDvcID->dwPlatformIDOffset, dwLen);
    dwLen += dwIdx;
}
0 голосов
/ 06 сентября 2011

В моем поиске я также нашел эту страницу , очень полезную для получения IOCTRL_HAL_GET_DEVICEID:

Также подробно описана структура DEVICE_ID, которая необходима для использования вызова:

#define IOCTL_HAL_GET_DEVICEID CTL_CODE(FILE_DEVICE_HAL, 21, METHOD_BUFFERED, FILE_ANY_ACCESS) 

typedef struct _DEVICE_ID { 
    DWORD dwSize; 
    DWORD dwPresetIDOffset; 
    DWORD dwPresetIDBytes; 
    DWORD dwPlatformIDOffset; 
    DWORD dwPlatformIDBytes; 
} DEVICE_ID, *PDEVICE_ID; 

Что не обязательно очевидно, так это то, что данные, содержащиеся в данных смещениях, являются просто значениями типа int и, вероятно, лучше всего их рассматривать как шестнадцатеричные коды.

...