• <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ū)動層,依傳輸類型的不同,輸入緩沖區(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ū)動層,依傳輸類型的不同,輸出緩沖區(qū)的位置亦不同,見下表。
            傳輸類型                              位置
            METHOD_IN_DIRECT                irp->MdlAddress
            METHOD_OUT_DIRECT             irp->MdlAddress
            METHOD_BUFFERED                 irp->AssociatedIrp.SystemBuffer
            METHOD_NEITHER                    irp->UserBuffer

            所以只要確定了傳輸方式后,就可以根據(jù)各自的位置來讀取和寫入數(shù)據(jù),從而實(shí)現(xiàn)應(yīng)用層和驅(qū)動的通信。
            下面看驅(qū)動層對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;
            }
            代碼比較簡單,都是取得輸入的數(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ā)送和接受的過程。
            需要通信,只要如下做:
            代碼:
            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方式通信,其他通信方式類似,大家可以參考代碼了,這里就不列舉了,由于代碼比較簡單,我就不多說了,大家還是看代碼吧,很好明白。最后,給個測試圖:

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

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

            <2011年9月>
            28293031123
            45678910
            11121314151617
            18192021222324
            2526272829301
            2345678

            常用鏈接

            留言簿(17)

            隨筆分類(138)

            隨筆檔案(137)

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

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 500434
            • 排名 - 37

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            久久国产精品一区二区| 国产精品美女久久久久av爽| 18岁日韩内射颜射午夜久久成人| 久久热这里只有精品在线观看| 无码伊人66久久大杳蕉网站谷歌 | 9191精品国产免费久久| 国产精品狼人久久久久影院| 久久久SS麻豆欧美国产日韩| 伊人热人久久中文字幕| 亚洲va国产va天堂va久久| 国内精品久久久久久久亚洲| 日韩av无码久久精品免费| 九九久久精品国产| …久久精品99久久香蕉国产| 国产精品成人久久久| 精品一久久香蕉国产线看播放 | 久久人人爽人人爽人人片AV不| 日本久久久精品中文字幕| 亚洲精品乱码久久久久久久久久久久| 国产99久久久国产精品~~牛| 91精品国产91久久久久福利| 国内精品伊人久久久久妇| 99精品国产99久久久久久97| 国产精品99久久久精品无码| 午夜精品久久久久久影视777 | 麻豆精品久久久久久久99蜜桃| 久久99国产一区二区三区| 欧美亚洲国产精品久久蜜芽 | 久久99精品国产| 国内精品伊人久久久久AV影院| 久久精品国产清自在天天线 | 久久99精品国产| 久久久综合九色合综国产| 国产精品久久99| 国产午夜电影久久| 久久国产精品国语对白| 九九久久精品国产| 国产精品久久新婚兰兰| 99久久香蕉国产线看观香| 97久久婷婷五月综合色d啪蜜芽| 99精品久久精品一区二区|