驅動是ring0的程式**,我們ring3代的程式如果想控制ring0級的功能,那麼就需要學會ring0與ring3之間的通訊。今天就開始學習驅動與應用程式之間的通訊。我們需要在驅動產現乙個加法運算,然後我們在應用程式將兩個運算數傳入到驅動層,由驅動層計算了結果返回給應用程。
我們向驅動傳輸命令需要用到:deviceiocontrol這個api,它是應用程的api,關於引數我不想過多解釋,因為msdn上很清楚。這兒給出乙個例項**:
int add(handle hdevice, int a,int b)
hdevice是我們找開驅動的符號聯接的控制代碼,見**:
handle hdevice = createfile(l"\\\\.\\firstsysdevice", //\\??\\firstsysdevice generic_read | generic_write, 0, // share mode none null, // no security open_existing, file_attribute_normal, null ); // no template
一但應用層用了deviceiocontrol這個api,那麼驅動就會收到irp_mj_device_control這個型別的irp請求。 我們只需要在這個型別的請求的派遣函式中實現我們的加法運算就完成我們的功能了。關於它的更多說明請參看:
**如下:
//派遣函式 #pragma pagecode ntstatus ddk_dispatchroutine_control(in pdevice_object pdevobj,in pirp pirp ) kdprint(("a=%d,b=%d \n", a,b)); a=a+b; //c、驅動層返回資料至使用者層 //操作輸出緩衝區 int* outputbuffer = (int*)pirp->associatedirp.systembuffer; __asm kdprint(("a+b=%d \n",a)); //設定實際操作輸出緩衝區長度 info = 4; break; } case sub_code: }//end code switch break; } case irp_mj_create: case irp_mj_close: case irp_mj_read: } //對相應的ipr進行處理 pirp->iostatus.information=info;//設定操作的位元組數為4,返回位元組數 pirp->iostatus.status=status_success;//返回成功 iocompleterequest(pirp,io_no_increment);//指示完成此irp kdprint(("離開派遣函式\n"));//除錯資訊 return status_success; //返回成功 }
本節是用緩衝區的方式通訊的,下一節我們將介紹直接操作方式通訊。
菜鳥之驅動開發11
在本節中,我們將學習驅動層的記憶體管理,介紹記憶體管理中常用的api,並與應用層內管理api相對應。核心中常用的記憶體管理api與應用層記憶體管理api對應關係如下 核心api 應用層c api 說明rtlcopymemory memcpy 記憶體拷貝 rtlcopybytes memcpy 記憶體...
菜鳥之驅動開發12
在本節中,我們學習在驅動中如何操作雙向鍊錶 鍊錶的建立,初始化,遍歷,刪除。驅動中有自己的鍊錶接構,也有相專用的操作鍊錶函式,也可以用c c 中自已實現的鍊錶。驅動中的鍊錶接構是 list entry 操作鍊錶的主要api有 initializelisthead 初始化鍊錶 islistempty ...
Linux驅動開發之DRM驅動
qq群 852283276 b站 主頁 drm 驅動程式開發 開篇 drm 驅動程式開發 vkms 最簡單的drm應用程式 single buffer drm 驅動是如何建立 fb device 的 linux中的drm 介紹 linux graphic dri 顯示子系統 介紹1 xilinx d...