由於WinCE6.0將driver放入kernel mode,不像WinCE5.0 driver及application都在 user mode執行,Application很容易就可以直接存取硬體。
WinCE6.0 application在存取上硬體上有先天的限制。
但是我們可以利用IO Control code, 透過這API呼叫kernel mode的driver,讓driver協助我們存取硬體。
我們可以利用BIB及REG檔讓driver載入至kernel mode。 但假使我們不是OS開發商,無法透由此方式載入呢?
我們可以透由API達到相同的功能。
static BOOL loadDriver(void)
{
HKEY hkResult;
DWORD value;
// 新增driver的registry key
RegCreateKeyEx(HKEY_LOCAL_MACHINE, REG_PATH, 0, NULL, REG_OPTION_VOLATILE, 0, NULL, &hkResult, NULL);
RegSetValueEx(hkResult, TEXT("Dll"), 0, REG_SZ, (const PBYTE)TEXT("SampleDriver.dll"), sizeof(TEXT("SampleDriver.dll")));
RegSetValueEx(hkResult, TEXT("Prefix"), 0, REG_SZ, (const PBYTE)TEXT("SPD"), sizeof(TEXT("SPD")));
value = 0x00;
RegSetValueEx(hkResult, TEXT("Index"), 0, REG_DWORD, (const PBYTE)&value, sizeof(DWORD));
// 將driver載入
hdrv = ActivateDeviceEx(REG_PATH, NULL, 0, NULL);
// Open driver來使用
handle = CreateFile(
TEXT("SPD0:"), // Pointer to the name of the port
GENERIC_READ | GENERIC_WRITE, // Access (read-write) mode
0, // Share mode
NULL, // Pointer to the security attribute
OPEN_EXISTING, // How to open the serial port
0, // Port attributes
NULL
); // Handle to port with attribute to copy
if(handle == INVALID_HANDLE_VALUE)
{
RETAILMSG(1, (TEXT("Open sample driver fail!\r\n")));
return FALSE;
}
RETAILMSG(1, (TEXT("Open sample driver success!\r\n")));
return TRUE;
}
沒有留言:
張貼留言