/* 驅動sys irp1.h */
#include
/*採用緩衝區記憶體模式ioctl,
my_dvc_buffered_code是自定義的控制碼*/
#define my_dvc_buffered_code /
(ulong)ctl_code(file_device_unknown, /
0x900, /
method_buffered, /
file_any_access)
//---------函式宣告---------
ntstatus
driverentry(in pdriver_object driverobject,
in punicode_string registrypath);
ntstatus
mydeviceiocontrol(in pdevice_object deviceobject,
in pirp irp);
ntstatus
mycreateclose(in pdevice_object deviceobject,
in pirp irp);
void
mydriveronunload(in pdriver_object driverobject);
//-------------------------
/* 驅動sys irp1.c */
#include "irp1.h"
//------------驅動入口----------
ntstatus driverentry( in pdriver_object driverobject, in punicode_string registrypath )
else
dbgprint("[aliwy] iocreatedevice success/n");
/* iocreatesymboliclink 生成符號鏈結 */
ntstatus = iocreatesymboliclink(&devicelink, &devicename);
if (!nt_success(ntstatus))
else
dbgprint("[aliwy] iocreatesymboliclink success/n");
device->flags &= ~do_device_initializing; //裝置初始化完成標記
driverobject->driverunload = mydriveronunload;
/*裝置控制請求,對應ring3 deviceiocontrol*/
driverobject->majorfunction[irp_mj_device_control] = mydeviceiocontrol;
/*裝置開啟請求,對應ring3 createfile*/ //
driverobject->majorfunction[irp_mj_create] = mycreateclose; // 要與應用層通訊,
/*裝置關閉請求,對應ring3 closehandle*/ // 必須有開啟、關閉請求!
driverobject->majorfunction[irp_mj_close] = mycreateclose; //
return ntstatus;
} //------------------------------
//---------裝置請求處理---------
ntstatus mydeviceiocontrol( in pdevice_object deviceobject, in pirp irp )
else
iocompleterequest(irp, io_no_increment); //結束irp請求
dbgprint("[aliwy] mydeviceiocontrol over/n");
return irp->iostatus.status;
} //------------------------------
//----------開啟關閉------------
ntstatus mycreateclose( in pdevice_object deviceobject, in pirp irp )
//------------------------------
//----------驅動解除安裝------------
void mydriveronunload( in pdriver_object driverobject )
} //------------------------------
/* 應用層exe irp1.cpp */
#include
#include
#include
/*採用緩衝區記憶體模式ioctl,my_dvc_in_code是自定義的控制碼*/
#define my_dvc_buffered_code /
(ulong)ctl_code(file_device_unknown, /
0x900, /
method_buffered, /
file_any_access)
void main()
memset(outbuf, 0, sizeof(outbuf));
/*控制裝置,響應驅動irp_mj_device_control*/
bool ret = deviceiocontrol(hdevice,
my_dvc_buffered_code, //我們自定義的功能號
&inbuf, //傳入驅動的內容
strlen(inbuf) + 1, //傳入內容長度
&outbuf, //驅動輸出的緩衝區
sizeof(outbuf), //驅動輸出緩衝區大小
&bytesreturned, //返回的長度
null);
if (!ret)
else
printf("%s(%d)/n", outbuf, bytesreturned); //列印驅動傳給我們的內容
/*關閉裝置,對應驅動irp_mj_close*/
closehandle(hdevice);
}
驅動與應用層簡單訊息通訊
驅動sys irp1.h include 採用緩衝區記憶體模式ioctl,my dvc buffered code是自定義的控制碼 define my dvc buffered code ulong ctl code file device unknown,0x900,method buffered...
應用層到驅動層
1 應用層 vfs 驅動層 硬體層 2 應用層的程式要想跟底層的硬體打交道必須要有裝置檔案 在應用層通過open開啟乙個裝置檔案時,在vfs層會建立inode結構體和file結構體,前者是靜態的描述裝置的一些資訊 如 裝置號,節點指標,裝置型別以及cdev結構體 後者則會描述裝置型別的一些動態資訊 ...
驅動與應用層之間的共享記憶體通訊與事件通知
驅動與應用程式之間通過共享記憶體通訊,即ring0與ring3共享記憶體,有時候是乙個顯而易見的需求,另外,驅動很多情況下也需要在某種條件滿足後主動通知應用程式做相應的操作,本文作一些我自己的學習心得記錄,以便以後參考。共享記憶體 這裡不準備寫得太多,在osr的文章中已經說得很明白了,這段時間正在做...