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

            所以只要確定了傳輸方式后,就可以根據(jù)各自的位置來(lái)讀取和寫(xiě)入數(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方式通信,其他通信方式類(lèi)似,大家可以參考代碼了,這里就不列舉了,由于代碼比較簡(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 閱讀(4382) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): windows驅(qū)動(dòng)

            <2009年4月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

            常用鏈接

            留言簿(17)

            隨筆分類(lèi)(138)

            隨筆檔案(137)

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

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 497473
            • 排名 - 36

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            精品久久久久久无码不卡| 伊人久久亚洲综合影院| 国产A三级久久精品| 亚洲精品NV久久久久久久久久| 久久综合久久久| 久久综合九色综合久99| 久久被窝电影亚洲爽爽爽| 精品久久久久久亚洲| 国产精品久久永久免费| 国内精品久久久久| 热久久这里只有精品| 国产精品亚洲综合专区片高清久久久| 久久精品无码一区二区三区| 久久99精品久久久久久| 亚洲成人精品久久| 久久青青草原亚洲av无码| 欧美一级久久久久久久大片| 欧美久久久久久| 色欲久久久天天天综合网精品 | 国产亚洲精久久久久久无码| 久久夜色精品国产网站| 91精品国产9l久久久久| 国产激情久久久久影院老熟女| 久久久久一本毛久久久| 欧美日韩精品久久免费| 日韩精品无码久久久久久| 久久精品国产免费一区| 四虎影视久久久免费| 久久这里只有精品18| 国产高潮国产高潮久久久91| 日本WV一本一道久久香蕉| 久久人人妻人人爽人人爽| 99久久免费国产精品热| 久久久久99精品成人片三人毛片| 日本高清无卡码一区二区久久| 国产A三级久久精品| 国产精品gz久久久| 久久久久亚洲av无码专区导航| 国产成人无码精品久久久久免费 | 精品久久久久久国产牛牛app| 亚洲人成无码久久电影网站|