菜鳥之驅動開發7

來源:互聯網
上載者:User

 

 驅動是RING0的程式碼,我們Ring3代的程式如果想控制ring0級的功能,那麼就需要學會ring0與ring3之間的通訊。今天就開始學習驅動與應用程式之間的通訊。我們需要在驅動產現一個加法運算,然後我們在應用程式將兩個運算數傳入到驅動層,由驅動層計算了結果返回給應用程。

我們向驅動傳輸命令需要用到:DeviceIoControl這個api,它是應用程的api,關於參數我不想過多解釋,因為MSDN上很清楚。這兒給出一個執行個體代碼:

int add(HANDLE hDevice, int a,int b){int port[2];int bufret;ULONG dwWrite;port[0]=a;port[1]=b;DeviceIoControl(hDevice, add_code , &port, 8, &bufret, 4, &dwWrite, NULL);return bufret;}

 

hDevice是我們找開驅動的符號聯結的控制代碼,見代碼:

HANDLE hDevice = CreateFile(L"\\\\.\\firstSysDevice", //\\??\\firstSysDeviceGENERIC_READ | GENERIC_WRITE,0,// share mode noneNULL,// no securityOPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL );// no template

 

一但應用程式層用了DeviceIoControl這個api,那麼驅動就會收到IRP_MJ_DEVICE_CONTROL這個類型的IRP請求。 我們只需要在這個類型的請求的派遣函數中實現我們的加法運算就完成我們的功能了。關於它的更多說明請參看:http://blog.csdn.net/caperingrabbit/article/details/5134051
代碼如下:

//派遣函數#pragma PAGECODENTSTATUS ddk_DispatchRoutine_CONTROL(IN PDEVICE_OBJECT pDevobj,IN PIRP pIrp){   ULONG info;NTSTATUS status = STATUS_SUCCESS;//得到當前棧指標PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);ULONG mf=stack->MajorFunction;//區分IRPswitch (mf){case IRP_MJ_DEVICE_CONTROL:{ KdPrint(("Enter myDriver_DeviceIOControl\n"));//得到輸入緩衝區大小ULONG cbin = stack->Parameters.DeviceIoControl.InputBufferLength;//得到輸出緩衝區大小ULONG cbout = stack->Parameters.DeviceIoControl.OutputBufferLength;//得到IOCTL碼ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;switch (code){ case add_code:{  int a,b;KdPrint(("add_code 1111111111111111111\n"));//緩衝區方式IOCTL//擷取緩衝區資料a,bint * InputBuffer = (int*)pIrp->AssociatedIrp.SystemBuffer;__asm{   mov eax,InputBuffermov ebx,[eax]mov a,ebxmov ebx,[eax+4]mov b,ebx}KdPrint(("a=%d,b=%d \n", a,b));a=a+b;//C、驅動層返回資料至使用者層//操作輸出緩衝區int* OutputBuffer = (int*)pIrp->AssociatedIrp.SystemBuffer;__asm{    mov eax,amov ebx,OutputBuffermov [ebx],eax //bufferet=a+b}KdPrint(("a+b=%d \n",a));//設定實際操作輸出緩衝區長度info = 4;break;}case sub_code:{break;}}//end code switchbreak;}case IRP_MJ_CREATE:{break;}case IRP_MJ_CLOSE:{break;}case IRP_MJ_READ:{break;}}//對相應的IPR進行處理pIrp->IoStatus.Information=info;//設定作業的位元組數為4,返回位元組數pIrp->IoStatus.Status=STATUS_SUCCESS;//返回成功IoCompleteRequest(pIrp,IO_NO_INCREMENT);//指示完成此IRPKdPrint(("離開派遣函數\n"));//調試資訊return STATUS_SUCCESS; //返回成功}

 

本節是用緩衝區的方式通訊的,下一節我們將介紹直接操作方式通訊。

好了,介紹得差不多了,下載完整源碼運行看效果。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.