日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图解WinCE6.0下的内核驱动和用户驱动

發布時間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图解WinCE6.0下的内核驱动和用户驱动 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

圖解WinCE6.0下的內核驅動和用戶驅動

????? 在《WinCE驅動程序的分類》中曾提到,WinCE6.0的流驅動既可以加載到內核態也可以加載到用戶態。下面通過一組圖片簡單說明一下這兩種驅動的關系。

????? 首先編寫一個流驅動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

?????? 通過驅動調試助手動態加載該驅動,在加載時,根據注冊表中的設置,分別加載兩個到內核空間和用戶空間。

??????

?????????????????????????????????? 通過驅動調試助手導入注冊表文件

??????

??????????????????????????????????? 用戶態和內核態分別加載兩個,共加載四個驅動

??????

?????????????????????????????????加載驅動過程時的串口打印

??????

????????????????加載驅動成功后,HKEY_LOCAL_MACHINE\Drivers\Active下內核驅動對應的鍵

???????

???????????????????? 加載驅動成功后,HKEY_LOCAL_MACHINE\Drivers\Active下用戶驅動對應的鍵??????

????????????????????????? 通過遠程堆查看器,查看內存的分配情況

??????

????????????????????? 通過遠程進程查看器 ,查看wcedrv.dll加載為內核態驅動?

??????

??????????????????????????通過遠程進程查看器,查看wcedrv.dll加載為用戶態驅動1

??????

??????????????????????通過遠程進程查看器,查看wcedrv.dll加載為用戶態驅動2

????? WCEDRV的源代碼下載地址:http://files.cnblogs.com/we-hjb/WCEDrv.rar

總結

以上是生活随笔為你收集整理的图解WinCE6.0下的内核驱动和用户驱动的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。