2013年6月14日 星期五

How to access Hardware in WinCE6.0

由於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;
}

沒有留言:

張貼留言