1. 程式人生 > >應用程式與驅動互動訪問(其它模式)

應用程式與驅動互動訪問(其它模式)

A、使用者層傳入資料EXE部分程式碼

 B、驅動層接收資料並處理SYS部分程式碼

 C、驅動層返回資料至使用者層

 D、使用者層獲得處理結果

 E、驅動中的異常處理

 A、使用者層傳入資料EXE部分程式碼

修改標頭檔案METHOD_NEITHER

#define add_code CTL_CODE(

                        FILE_DEVICE_UNKNOWN,

                        0x800,

                        METHOD_NEITHER,

                        FILE_ANY_ACCESS)

在講直接記憶體訪問模式時,我們不得不再次講到CTL_CODE巨集的Method項

CTL_CODE(DeviceType,Function,Method,Acess);

Method是指定資料傳遞的模式 有這幾個值:

METHOD_BUFFERED //使用緩衝區方式操作 0

METHOD_IN_DIRECT //直接寫方式 1

METHOD_OUT_DIRECT //直接讀方式 2

METHOD_NEITHER //其它方式 3

 B、驅動層接收資料並處理SYS部分程式碼

//得到輸出緩衝區大小

   ULONG cbout = stack->Parameters.DeviceIoControl.OutputBufferLength;

VOID ProbeForRead(  __in  PVOID Address,   __in  SIZE_T Length,   __in  ULONG Alignment );

VOID ProbeForWrite( __inout PVOID Address,   __in  SIZE_T Length,    __in  ULONG Alignment );

          //1 得到輸入入緩衝區 首地址

          UCHAR *InputBuffer=(UCHAR *)stack->Parameters.DeviceIoControl.Type3InputBuffer;

            try

            {

            ProbeForRead(InputBuffer,cbin,__alignof(int));

          __except(EXCEPTION_EXECUTE_HANDLER)

                     {

                            KdPrint(("指定記憶體不可讀 或者 不可寫 ,將繼續執行後邊程式碼 \n"));

                     }

                   try

            {

           //操作輸出緩衝區

            //2 得到輸出緩衝首地址

            PVOID OutputBuffer=pIrp->UserBuffer;

            //判斷指標是否可寫

             ProbeForWrite(OutputBuffer,cbout,4);

          __except(EXCEPTION_EXECUTE_HANDLER)

           {

                   KdPrint(("指定記憶體不可讀 或者 不可寫 ,將繼續執行後邊程式碼 \n"));

            }

__alignof 操作符 返回一個值,型別為size_t,其為該型別對齊要求的大小(位元組數)

格式: __alignof(type)

註釋: 舉例: 表示式    值 __alignof(char)  1 __alignof(short) 2 __alignof(int)  4 __alignof(__int64) 8 __alignof(float) 4 __alignof(double) 8 __alignof(char*) 4 對於基本型別它的值和sizeof一樣.但考慮這個例子: typedef struct {int a; double b;}S; //__alignof(S) == 8 在這種情況下,__alignof的值是該結構體中最長元素的對齊要求 類似的,對於

#pragma pack(1)

#pragma pack()

add,sub,mul,div,字串