• <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
            技術文摘
            posts - 137,  comments - 268,  trackbacks - 0
            原文:sislcb(

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

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

            所以只要確定了傳輸方式后,就可以根據各自的位置來讀取和寫入數據,從而實現應用層和驅動的通信。
            下面看驅動層對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;
            }
            代碼比較簡單,都是取得輸入的數據,然后把數據直接拷貝到輸出,傳輸給應用層。
            應用層的代碼:
            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;
            
            上面是進行發送和接受的過程。
            需要通信,只要如下做:
            代碼:
            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方式通信,其他通信方式類似,大家可以參考代碼了,這里就不列舉了,由于代碼比較簡單,我就不多說了,大家還是看代碼吧,很好明白。最后,給個測試圖:

            應用層:
            名稱:  1.jpg
查看次數: 1449
文件大小:  27.9 KB
            驅動層:
            名稱:  2.jpg
查看次數: 1443
文件大小:  34.9 KB

            代碼:
            驅動和應用層通信.rar/Files/aurain/ioctl.rar
            posted on 2009-03-30 16:31 閱讀(4386) 評論(0)  編輯 收藏 引用 所屬分類: windows驅動

            <2009年11月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿(17)

            隨筆分類(138)

            隨筆檔案(137)

            網絡開發

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 499036
            • 排名 - 36

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            中文字幕热久久久久久久| 国产精品久久网| 久久免费看黄a级毛片| 欧美日韩精品久久久久| 久久久亚洲欧洲日产国码aⅴ | 久久精品九九亚洲精品| 中文字幕亚洲综合久久2| 亚洲va久久久久| 99久久精品无码一区二区毛片| 伊人色综合九久久天天蜜桃 | 久久婷婷国产剧情内射白浆| 99久久国产热无码精品免费| 中文字幕精品无码久久久久久3D日动漫| 丁香色欲久久久久久综合网| 国产精品热久久无码av| 久久99精品久久久久婷婷| 青青热久久综合网伊人| 久久久免费精品re6| 亚洲精品视频久久久| 91亚洲国产成人久久精品网址| 亚洲色大成网站WWW久久九九| 一本久久久久久久| 精品国产VA久久久久久久冰| 久久久这里有精品| 亚洲成av人片不卡无码久久| 热re99久久精品国产99热| 久久久久久亚洲精品成人| 国产成人综合久久精品红| 久久影院久久香蕉国产线看观看| 国产成人综合久久综合| 国产亚洲色婷婷久久99精品| 色偷偷久久一区二区三区| 中文字幕乱码久久午夜| 久久午夜夜伦鲁鲁片免费无码影视| 理论片午午伦夜理片久久| 久久久久无码专区亚洲av| 久久青青草原亚洲av无码| 久久综合色之久久综合| 日韩影院久久| 久久精品国产清自在天天线| 国内高清久久久久久|