图解WinCE6.0下的内核驱动和用户驱动
圖解WinCE6.0下的內核驅動和用戶驅動
????? 在《WinCE驅動程序的分類》中曾提到,WinCE6.0的流驅動既可以加載到內核態(tài)也可以加載到用戶態(tài)。下面通過一組圖片簡單說明一下這兩種驅動的關系。
????? 首先編寫一個流驅動WCEDrv,代碼如下。
代碼 #include?<windows.h>extern?"C"
BOOL?WINAPI?DllMain(HANDLE?hinstDLL,?DWORD?dwReason,?LPVOID?lpvReserved)
{
????UNREFERENCED_PARAMETER(lpvReserved);
????switch(dwReason)?{
????case?DLL_PROCESS_ATTACH:
????????DisableThreadLibraryCalls((HMODULE)?hinstDLL);
????????break;
????case?DLL_PROCESS_DETACH:
????????break;
????};
????return?TRUE;
}
extern?"C"
DWORD?Init(LPCTSTR?pContext,?DWORD?dwBusContext)
{
????RETAILMSG(1,(_T("Init(%s,?%x)"),pContext,dwBusContext));
????
????PBYTE?pBuffer?=?new?BYTE[4096*1024];?????
????RETAILMSG(1,(TEXT("pBuffer(%x)\r\n"),pBuffer));
????return??(DWORD)pBuffer;
}
extern?"C"
BOOL?Deinit(DWORD?hDeviceContext)
{
????RETAILMSG(1,(_T("Deinit(%x)\r\n"),hDeviceContext));
????
????PBYTE?pBuffer?=?(PBYTE)hDeviceContext;
????if?(pBuffer)
????{
????????delete[]?pBuffer;
????}????
????return?TRUE;
}
extern?"C"
void?PowerUp(DWORD?hDeviceContext)
{
}
extern?"C"
void?PowerDown(DWORD?hDeviceContext)
{
}
extern?"C"
DWORD?Open(DWORD?hDeviceContext,?DWORD?AccessCode,?DWORD?ShareMode)
{
????RETAILMSG(1,(_T("Open(%x,?0x%x,?0x%x)\r\n"),hDeviceContext,?AccessCode,?ShareMode));
????return?hDeviceContext;
}
extern?"C"
BOOL?Close(DWORD?hOpenContext)
{
????RETAILMSG(1,(_T("Close(%x)\r\n"),hOpenContext));
????return?TRUE;
}
extern?"C"
BOOL?IOControl(DWORD?hOpenContext,?DWORD?dwCode,?PBYTE?pBufIn,?DWORD?dwLenIn
???????????????,?PBYTE?pBufOut,?DWORD?dwLenOut,?PDWORD?pdwActualOut)
{
????UNREFERENCED_PARAMETER(hOpenContext);
????UNREFERENCED_PARAMETER(dwCode);
????UNREFERENCED_PARAMETER(pBufIn);
????UNREFERENCED_PARAMETER(dwLenIn);
????UNREFERENCED_PARAMETER(pBufOut);
????UNREFERENCED_PARAMETER(dwLenOut);
????UNREFERENCED_PARAMETER(pdwActualOut);
????SetLastError(ERROR_INVALID_FUNCTION);
????return?FALSE;
}
extern?"C"
DWORD?Read(DWORD?hOpenContext,?LPVOID?pBuffer,?DWORD?Count)
{
????RETAILMSG(1,(_T("Read(%x,?%x,?0x%x)\r\n"),hOpenContext,?pBuffer,?Count));
????return?TRUE;
}
extern?"C"
DWORD?Write(DWORD?hOpenContext,?LPCVOID?pBuffer,?DWORD?Count)
{
????RETAILMSG(1,(_T("Write(%x,?%x,?0x%x)\r\n"),hOpenContext,?pBuffer,?Count));
????return?TRUE;
}
extern?"C"
DWORD?Seek(DWORD?hOpenContext,?long?Amount,?WORD?Type)
{
????UNREFERENCED_PARAMETER(hOpenContext);
????UNREFERENCED_PARAMETER(Amount);
????UNREFERENCED_PARAMETER(Type);
????SetLastError(ERROR_NOT_SUPPORTED);
????return?-1;
}
?????? 其對應的注冊表文件內容如下。
注冊表 [HKEY_LOCAL_MACHINE\Drivers\WCEDrv1]????"Prefix"="AAA"
????"Dll"="WCEDrv.dll"
????"Index"=dword:1
????"Flags"=dword:8????????;?DEVFLAGS_NAKEDENTRIES
????"Order"=dword:0
[HKEY_LOCAL_MACHINE\Drivers\WCEDrv2]
????"Prefix"="BBB"
????"Dll"="WCEDrv.dll"
????"Index"=dword:1
????"Flags"=dword:8????????;?DEVFLAGS_NAKEDENTRIES
????"Order"=dword:0
[HKEY_LOCAL_MACHINE\Drivers\WCEDrv3]
????"Prefix"="CCC"
????"Dll"="WCEDrv.dll"
????"Index"=dword:1
????"Flags"=dword:18????;?DEVFLAGS_LOAD_AS_USERPROC?|?DEVFLAGS_NAKEDENTRIES
????"Order"=dword:0
[HKEY_LOCAL_MACHINE\Drivers\WCEDrv4]
????"Prefix"="DDD"
????"Dll"="WCEDrv.dll"
????"Index"=dword:1
????"Flags"=dword:18????;?DEVFLAGS_LOAD_AS_USERPROC?|?DEVFLAGS_NAKEDENTRIES
????"Order"=dword:0
?????? 通過驅動調試助手動態(tài)加載該驅動,在加載時,根據(jù)注冊表中的設置,分別加載兩個到內核空間和用戶空間。
??????
?????????????????????????????????? 通過驅動調試助手導入注冊表文件
??????
??????????????????????????????????? 用戶態(tài)和內核態(tài)分別加載兩個,共加載四個驅動
??????
?????????????????????????????????加載驅動過程時的串口打印
??????
????????????????加載驅動成功后,HKEY_LOCAL_MACHINE\Drivers\Active下內核驅動對應的鍵
???????
???????????????????? 加載驅動成功后,HKEY_LOCAL_MACHINE\Drivers\Active下用戶驅動對應的鍵??????
????????????????????????? 通過遠程堆查看器,查看內存的分配情況
??????
????????????????????? 通過遠程進程查看器 ,查看wcedrv.dll加載為內核態(tài)驅動?
??????
??????????????????????????通過遠程進程查看器,查看wcedrv.dll加載為用戶態(tài)驅動1
??????
??????????????????????通過遠程進程查看器,查看wcedrv.dll加載為用戶態(tài)驅動2
????? WCEDRV的源代碼下載地址:http://files.cnblogs.com/we-hjb/WCEDrv.rar
總結
以上是生活随笔為你收集整理的图解WinCE6.0下的内核驱动和用户驱动的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网飞《生化危机》中文正式预告:丧尸围城逃
- 下一篇: 横置9挡大扭矩!红旗自主研发DCT 45