青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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 閱讀(4404) 評論(0)  編輯 收藏 引用 所屬分類: windows驅動

<2014年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用鏈接

留言簿(17)

隨筆分類(138)

隨筆檔案(137)

網絡開發

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 502446
  • 排名 - 37

最新隨筆

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品久久一区二区三区| 亚洲精品国产精品国自产观看 | 欧美交受高潮1| 亚洲激情中文1区| 亚洲一区二区在线视频| 国产精品视频免费一区| 亚洲欧美一区二区在线观看| 久久天堂精品| 亚洲精品美女在线观看| 欧美性jizz18性欧美| 性一交一乱一区二区洋洋av| 暖暖成人免费视频| 亚洲无限av看| 国产自产精品| 欧美精品一区二区三区四区| 一区二区三区回区在观看免费视频| 午夜在线视频观看日韩17c| 精品二区视频| 欧美日韩国产成人| 性18欧美另类| 91久久精品一区| 久久精品国产精品亚洲综合| 亚洲欧洲午夜| 国产在线精品一区二区夜色| 欧美黄色免费| 久久高清免费观看| 99精品欧美一区二区三区综合在线| 久久精品亚洲国产奇米99| 91久久精品国产91性色| 国产精品一区二区黑丝| 美女视频一区免费观看| 亚洲伊人色欲综合网| 欧美激情精品久久久六区热门| 午夜视黄欧洲亚洲| 亚洲日本中文字幕区| 国产亚洲网站| 国产精品黄色在线观看| 欧美成人性网| 久久久久久久性| 亚洲欧美日韩在线| 日韩写真视频在线观看| 欧美高清视频一区二区| 久久精品1区| 亚洲一区3d动漫同人无遮挡| 亚洲精品久久久久中文字幕欢迎你 | 欧美一级在线亚洲天堂| 日韩视频在线免费| 在线播放豆国产99亚洲| 国产欧美一区二区三区在线老狼| 欧美日韩a区| 欧美电影在线播放| 久久精品视频在线免费观看| 亚洲欧美日韩精品久久奇米色影视| 亚洲乱亚洲高清| 亚洲福利在线观看| 欧美不卡在线视频| 美女精品网站| 久久精品成人| 性久久久久久久久| 午夜国产精品影院在线观看| 亚洲夜间福利| 亚洲一级特黄| 亚洲永久视频| 亚洲一区影院| 在线性视频日韩欧美| 99精品国产福利在线观看免费| 91久久综合| 日韩视频欧美视频| 亚洲精品国产品国语在线app| 亚洲国产一区二区视频 | 亚洲精品在线三区| 亚洲精品久久久久久久久| 亚洲欧洲精品成人久久奇米网| 亚洲国产二区| 亚洲精品视频在线看| 亚洲精品免费网站| 一区二区三区黄色| 亚洲一区二三| 欧美亚洲系列| 久久久精品日韩| 麻豆91精品| 亚洲第一中文字幕在线观看| 亚洲国产精品美女| 99热精品在线观看| 亚洲综合激情| 久久久国产精品一区二区中文| 久久青青草原一区二区| 欧美福利视频一区| 欧美午夜在线视频| 国产午夜精品美女毛片视频| 在线观看视频日韩| 日韩视频在线免费| 午夜在线精品| 免费观看成人| 日韩午夜黄色| 欧美一区二区三区免费看| 久久综合一区| 欧美视频一区二区三区四区| 国产欧美在线视频| 亚洲经典一区| 亚洲欧美日本视频在线观看| 久久全球大尺度高清视频| 亚洲高清色综合| 亚洲午夜成aⅴ人片| 久久久久.com| 欧美日本在线视频| 国产又爽又黄的激情精品视频| 亚洲精品裸体| 亚欧成人在线| 亚洲经典在线| 久久av一区| 欧美日韩视频| 一区在线播放| 亚洲自拍偷拍麻豆| 欧美成人综合网站| 亚洲一区在线免费观看| 你懂的国产精品永久在线| 国产精品系列在线| 亚洲欧洲三级电影| 久久精品午夜| 一区二区日本视频| 免费不卡在线观看av| 国产九九精品| 制服丝袜亚洲播放| 欧美xart系列高清| 香蕉久久夜色精品国产使用方法| 欧美久久久久久久久| 一区二区三区在线免费视频| 小黄鸭视频精品导航| 亚洲日本欧美天堂| 老妇喷水一区二区三区| 国产亚洲福利一区| 亚洲五月六月| 亚洲经典在线| 男人的天堂成人在线| 国产一区二区中文字幕免费看| 亚洲一区视频| 亚洲麻豆av| 欧美成人免费全部观看天天性色| 狠狠干综合网| 欧美在线免费看| 亚洲天堂男人| 欧美四级电影网站| 亚洲色图自拍| 亚洲三级观看| 欧美精品粉嫩高潮一区二区| 亚洲第一网站| 男同欧美伦乱| 狂野欧美激情性xxxx欧美| 国产综合18久久久久久| 欧美一区二区视频网站| 亚洲视频在线看| 国产精品久久久久久久久久三级 | 亚洲狼人综合| 欧美精品91| 亚洲伦理中文字幕| 亚洲人成人一区二区在线观看 | 国产精品高潮呻吟视频| 中日韩高清电影网| 99精品欧美一区| 欧美三级网页| 亚洲欧美日韩综合| 亚洲天堂偷拍| 国产欧美日韩亚洲| 久久久久久**毛片大全| 久久久成人网| 亚洲全黄一级网站| 日韩视频二区| 国产精品国产一区二区| 欧美一区二区高清| 久久福利一区| 亚洲欧洲一区二区三区| 91久久久国产精品| 欧美三区不卡| 欧美中文在线免费| 久久久欧美一区二区| 亚洲精品久久久久久久久久久久| 亚洲黄色一区二区三区| 欧美三级不卡| 久久精品国产免费看久久精品| 欧美在线不卡| 亚洲黄色在线视频| 夜夜精品视频一区二区| 国产精品自拍小视频| 美日韩精品免费| 欧美精品在线一区| 久久超碰97人人做人人爱| 久久免费99精品久久久久久| 日韩系列欧美系列| 亚洲欧美日韩一区二区在线| 在线观看的日韩av| 日韩西西人体444www| 国产日韩欧美二区| 欧美国产精品久久| 欧美午夜片在线观看| 久久人人爽爽爽人久久久| 欧美精品91| 久久久久久久久久久久久女国产乱 | 日韩手机在线导航| 国产亚洲日本欧美韩国|