• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            aurain
            技術(shù)文摘
            posts - 137,  comments - 268,  trackbacks - 0
            原文:sislcb(

            在驅(qū)動(dòng)層,依傳輸類型的不同,輸入緩沖區(qū)的位置亦不同,見下表。
            傳輸類型                               位置
            METHOD_IN_DIRECT                irp->AssociatedIrp.SystemBuffer
            METHOD_OUT_DIRECT             irp->AssociatedIrp.SystemBuffer
            METHOD_BUFFERED                 irp->AssociatedIrp.SystemBuffer
            METHOD_NEITHER                   irpStack->Parameters.DeviceIoControl.Type3InputBuffer

            在驅(qū)動(dòng)層,依傳輸類型的不同,輸出緩沖區(qū)的位置亦不同,見下表。
            傳輸類型                              位置
            METHOD_IN_DIRECT                irp->MdlAddress
            METHOD_OUT_DIRECT             irp->MdlAddress
            METHOD_BUFFERED                 irp->AssociatedIrp.SystemBuffer
            METHOD_NEITHER                    irp->UserBuffer

            所以只要確定了傳輸方式后,就可以根據(jù)各自的位置來(lái)讀取和寫入數(shù)據(jù),從而實(shí)現(xiàn)應(yīng)用層和驅(qū)動(dòng)的通信。
            下面看驅(qū)動(dòng)層對(duì)ioctl控制碼的處理代碼:

            代碼:
            //METHOD_OUT_DIREC方式
            NTSTATUS COMM_DirectOutIo(PIRP Irp, PIO_STACK_LOCATION pIoStackIrp, UINT *sizeofWrite)
            {
                NTSTATUS status = STATUS_UNSUCCESSFUL;
                PVOID pInputBuffer, pOutputBuffer;
              ULONG  outputLength, inputLength;
                DbgPrint("COMM_DirectOutIo\r\n");
                outputLength = pIoStackIrp->Parameters.DeviceIoControl.OutputBufferLength;
                inputLength  = pIoStackIrp->Parameters.DeviceIoControl.InputBufferLength;
                pInputBuffer = Irp->AssociatedIrp.SystemBuffer;
                pOutputBuffer = NULL;
                if(Irp->MdlAddress)
                    pOutputBuffer = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
                if(pInputBuffer && pOutputBuffer)
                {                                                          
                    DbgPrint("COMM_DirectOutIo UserModeMessage = '%s'", pInputBuffer);
                    RtlCopyMemory(pOutputBuffer, pInputBuffer, outputLength);
                *sizeofWrite = outputLength;
                    status = STATUS_SUCCESS;
                }
                return status;
            }
            // METHOD_IN_DIRECT
            NTSTATUS COMM_DirectInIo(PIRP Irp, PIO_STACK_LOCATION pIoStackIrp, UINT *sizeofWrite)
            {
                NTSTATUS status = STATUS_UNSUCCESSFUL;
                PVOID pInputBuffer, pOutputBuffer;
              ULONG  outputLength, inputLength;
                DbgPrint("COMM_DirectInIo\r\n");
                outputLength = pIoStackIrp->Parameters.DeviceIoControl.OutputBufferLength;
                inputLength  = pIoStackIrp->Parameters.DeviceIoControl.InputBufferLength;
                pInputBuffer = Irp->AssociatedIrp.SystemBuffer;
                pOutputBuffer = NULL;
                if(Irp->MdlAddress)
                    pOutputBuffer = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
                if(pInputBuffer && pOutputBuffer)
                {                                                          
                    DbgPrint("COMM_DirectInIo UserModeMessage = '%s'", pInputBuffer);
                    RtlCopyMemory(pOutputBuffer, pInputBuffer, outputLength);
                    *sizeofWrite = outputLength;
                    status = STATUS_SUCCESS;
                }
                return status;
            }
            // METHOD_BUFFERED
            NTSTATUS COMM_BufferedIo(PIRP Irp, PIO_STACK_LOCATION pIoStackIrp, UINT *sizeofWrite)
            {
                NTSTATUS status = STATUS_UNSUCCESSFUL;
                PVOID pInputBuffer, pOutputBuffer;
              ULONG  outputLength, inputLength;
                DbgPrint("COMM_BufferedIo\r\n");
              outputLength = pIoStackIrp->Parameters.DeviceIoControl.OutputBufferLength;
                inputLength  = pIoStackIrp->Parameters.DeviceIoControl.InputBufferLength;
                pInputBuffer = Irp->AssociatedIrp.SystemBuffer;
                pOutputBuffer = Irp->AssociatedIrp.SystemBuffer;
                if(pInputBuffer && pOutputBuffer)
                {              
                DbgPrint("COMM_BufferedIo UserModeMessage = '%s'", pInputBuffer);
                    RtlCopyMemory(pOutputBuffer, pInputBuffer, outputLength);
                *sizeofWrite = outputLength;
                    status = STATUS_SUCCESS;
                }
                return status;
            }
            // METHOD_NEITHER
            NTSTATUS COMM_NeitherIo(PIRP Irp, PIO_STACK_LOCATION pIoStackIrp, UINT *sizeofWrite)
            {
                NTSTATUS status = STATUS_UNSUCCESSFUL;
                PVOID pInputBuffer, pOutputBuffer;
              ULONG  outputLength, inputLength;
                DbgPrint("COMM_NeitherIo\r\n");
              outputLength  = pIoStackIrp->Parameters.DeviceIoControl.OutputBufferLength;
                inputLength   = pIoStackIrp->Parameters.DeviceIoControl.InputBufferLength;
                pInputBuffer  = pIoStackIrp->Parameters.DeviceIoControl.Type3InputBuffer;
                pOutputBuffer = Irp->UserBuffer;
                if(pInputBuffer && pOutputBuffer)
                {              
                DbgPrint("COMM_NeitherIo UserModeMessage = '%s'", pInputBuffer);
                    RtlCopyMemory(pOutputBuffer, pInputBuffer, outputLength);
                *sizeofWrite = outputLength;
                    status = STATUS_SUCCESS;
                }
                return status;
            }
            代碼比較簡(jiǎn)單,都是取得輸入的數(shù)據(jù),然后把數(shù)據(jù)直接拷貝到輸出,傳輸給應(yīng)用層。
            應(yīng)用層的代碼:
            procedure TfrmMain.Send_Recv_Data(AInData: String; var AOutData:String;
              IoctlCode: DWORD);
            var
              dwReturn: DWORD;
              inData:array[0..1023] of char;
              outData:array[0..1023] of char;
            begin
              StrPCopy(inData, AInData);
              if m_hCommDevice <> 0 then
              begin
                DeviceIoControl(m_hCommDevice, IoctlCode, @inData,  Length(inData), @outData, Length(outData), dwReturn, nil);
                AOutData := StrPas(@outData);
              end;
            end;
            
            上面是進(jìn)行發(fā)送和接受的過(guò)程。
            需要通信,只要如下做:
            代碼:
            procedure TfrmMain. btnDirect_IN_IOClick (Sender: TObject);
            var
              outData:String;
            begin
              Send_Recv_Data(Trim(edtDirect_in_in.Text), outData, IOCTL_COMM_DIRECT_IN_IO);
              edtDirect_in_out.Text := outData;
            end;
            
            這是 direct_in方式通信,其他通信方式類似,大家可以參考代碼了,這里就不列舉了,由于代碼比較簡(jiǎn)單,我就不多說(shuō)了,大家還是看代碼吧,很好明白。最后,給個(gè)測(cè)試圖:

            應(yīng)用層:
            名稱:  1.jpg
查看次數(shù): 1449
文件大小:  27.9 KB
            驅(qū)動(dòng)層:
            名稱:  2.jpg
查看次數(shù): 1443
文件大小:  34.9 KB

            代碼:
            驅(qū)動(dòng)和應(yīng)用層通信.rar/Files/aurain/ioctl.rar
            posted on 2009-03-30 16:31 閱讀(4394) 評(píng)論(0)  編輯 收藏 引用 所屬分類: windows驅(qū)動(dòng)

            <2008年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿(17)

            隨筆分類(138)

            隨筆檔案(137)

            網(wǎng)絡(luò)開發(fā)

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 500428
            • 排名 - 37

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            国产69精品久久久久观看软件| 久久se精品一区精品二区| 亚洲国产综合久久天堂 | 久久久噜噜噜久久中文字幕色伊伊| 色成年激情久久综合| 久久天天婷婷五月俺也去| 久久久精品免费国产四虎| 97香蕉久久夜色精品国产| 日韩精品国产自在久久现线拍| 国内精品综合久久久40p| 久久国产V一级毛多内射| 精品国际久久久久999波多野| 久久精品免费网站网| 99精品久久精品一区二区| 久久免费看黄a级毛片| 久久99精品国产99久久6| 色诱久久久久综合网ywww | 中文字幕精品久久久久人妻| 久久精品国产精品国产精品污| 少妇熟女久久综合网色欲| 久久精品无码免费不卡| 久久美女人爽女人爽| 国产韩国精品一区二区三区久久| 欧美日韩精品久久久免费观看| 欧美国产成人久久精品| 久久99精品久久久久久9蜜桃 | 久久综合亚洲色一区二区三区| 久久99精品久久久久久噜噜| 久久精品国产亚洲沈樵| 久久久久国产一级毛片高清版| 久久精品中文无码资源站| 久久久噜噜噜久久中文福利| 亚洲午夜久久久久久久久久| 精品一二三区久久aaa片| 久久精品国产精品亚洲精品| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 999久久久国产精品| 国产精品99久久久久久www| 久久久噜噜噜久久| 精品国产青草久久久久福利| 国产成人精品久久|