• <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)用層:
            名稱(chēng):  1.jpg
查看次數(shù): 1449
文件大小:  27.9 KB
            驅(qū)動(dòng)層:
            名稱(chē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 閱讀(4386) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): windows驅(qū)動(dòng)

            <2008年2月>
            272829303112
            3456789
            10111213141516
            17181920212223
            2425262728291
            2345678

            常用鏈接

            留言簿(17)

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

            隨筆檔案(137)

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

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 499010
            • 排名 - 36

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久久久久国产精品美女| 欧美一级久久久久久久大| 亚洲精品WWW久久久久久| 国产激情久久久久影院| 久久99中文字幕久久| 久久综合给合久久狠狠狠97色| 久久综合久久综合九色| 久久影院午夜理论片无码| 国产精品99久久久久久猫咪| 国产精品久久久久9999高清| 亚洲精品高清国产一久久| 久久精品无码一区二区无码| 人妻少妇久久中文字幕一区二区| 亚洲国产成人久久精品影视| 精品国产91久久久久久久 | 久久久久亚洲av无码专区喷水 | 久久免费美女视频| 久久99国产精品久久| 精品人妻伦九区久久AAA片69| 国产巨作麻豆欧美亚洲综合久久 | 国产成人精品久久亚洲高清不卡| 久久精品国产99久久丝袜| 青青草原综合久久大伊人| 99久久婷婷免费国产综合精品| 久久夜色精品国产www| 青青久久精品国产免费看| 麻豆精品久久久久久久99蜜桃| 亚洲精品美女久久久久99| 日韩精品久久久肉伦网站| 久久青青草原国产精品免费| 久久久久国产一级毛片高清板 | 国产高清美女一级a毛片久久w| 免费精品久久久久久中文字幕| 久久亚洲电影| 久久久亚洲欧洲日产国码aⅴ| 国产精品久久久久一区二区三区| 久久亚洲av无码精品浪潮| 久久久久久久亚洲Av无码| 久久99精品九九九久久婷婷 | 色妞色综合久久夜夜| 777久久精品一区二区三区无码|