我在哪里可以得到pkfuncs.h(并访问KernelIoControl)
Where can I get pkfuncs.h (and access to KernelIoControl)?
我试图调用KernelIoControl,但在任何地方都找不到头文件pkfuncs.h。
我想知道是否:a)是否有我需要的秘密下载?b)或者它不存在,因为我使用的设备的SDK(卡西欧)不包括这些库?
也……大概是WINAPI吧?我想我还是动态链接到它吧
调用KernelIoControl不需要头文件。把它添加到你自己的应用中:
extern "C" BOOL KernelIoControl(
DWORD dwIoControlCode,
LPVOID lpInBuf,
DWORD nInBufSize,
LPVOID lpOutBuf,
DWORD nOutBufSize,
LPDWORD lpBytesReturned
);
链接器会帮你找到的
在我的搜索中,我还发现这个页面非常有用,可以获得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值,最好将其视为十六进制代码。
下面是我用来获取唯一设备ID的代码:
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;
}
相关文章:
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 我的简单if-else语句是如何无法访问的代码
- 从C++dll访问C#中的一行主要参数
- 概念TS检查忽略私有访问修饰符
- 访问被拒绝后,c++中的故障保护代码
- 在c++中访问int到类对象的映射时出错
- 我想访问std::unique_ptr中的一个特定元素
- 为什么示例代码访问IUnknown中已删除的内存
- C++:无法访问声明的受保护成员
- 通过指向指针数组的指针访问子类的属性
- 如何使用单独文件中的派生类访问友元函数对象