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

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

<2010年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(17)

隨筆分類(138)

隨筆檔案(137)

網絡開發

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 500846
  • 排名 - 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>
            欧美性片在线观看| 999在线观看精品免费不卡网站| 亚洲激情电影在线| 伊人久久亚洲美女图片| 国产日韩欧美综合一区| 国产一区二区日韩| 黑人一区二区三区四区五区| 黑人一区二区| 亚洲美女区一区| 亚洲线精品一区二区三区八戒| 亚洲在线第一页| 久久这里有精品视频| 嫩草国产精品入口| 亚洲最新色图| 久久久噜噜噜久噜久久| 裸体歌舞表演一区二区| 欧美视频中文字幕在线| 国产午夜精品麻豆| 亚洲日本欧美天堂| 性欧美video另类hd性玩具| 久久手机免费观看| 日韩亚洲视频在线| 久久久久久久久岛国免费| 欧美另类亚洲| 一区二区在线观看视频| 亚洲一二区在线| 欧美激情亚洲激情| 亚洲欧美激情四射在线日| 欧美另类专区| 国产日产高清欧美一区二区三区| 亚洲经典在线看| 久久精品99国产精品| 亚洲国产精品成人综合| 亚洲图片欧美一区| 欧美www视频在线观看| 国产视频亚洲精品| 亚洲在线成人精品| 亚洲国产精品悠悠久久琪琪| 小嫩嫩精品导航| 欧美日韩一区二区在线观看| 亚洲高清中文字幕| 久久精品国产亚洲高清剧情介绍| 亚洲欧洲在线播放| 久久夜色精品国产亚洲aⅴ| 久久精品中文字幕一区二区三区| 欧美日韩精品一区二区| 黄色资源网久久资源365| 亚洲欧美资源在线| 一本色道**综合亚洲精品蜜桃冫| 欧美成人高清| 亚洲激情国产| 亚洲高清自拍| 乱码第一页成人| 永久免费视频成人| 久久在线观看视频| 久久久久久久久久久久久女国产乱| 国产精品视频一二| 亚洲欧美在线播放| 亚洲在线中文字幕| 国产精品一区二区三区乱码 | 欧美gay视频| 午夜免费久久久久| 国产一级精品aaaaa看| 午夜一区二区三视频在线观看| 在线一区二区三区做爰视频网站 | 99精品国产高清一区二区| 欧美国产大片| 亚洲小少妇裸体bbw| 这里只有精品视频| 国产日韩欧美在线播放不卡| 久久成人亚洲| 另类激情亚洲| 亚洲伦理中文字幕| 亚洲最黄网站| 国内外成人免费激情在线视频网站| 久久精品一区蜜桃臀影院| 久久久国产精品亚洲一区| 亚洲激情第一区| 99精品久久久| 国产婷婷色综合av蜜臀av| 狼狼综合久久久久综合网| 欧美www视频| 午夜影院日韩| 老**午夜毛片一区二区三区| aa亚洲婷婷| 亚洲欧美激情诱惑| 亚洲第一黄色网| 一区二区免费在线播放| 国内精品视频一区| 亚洲精品社区| 国产尤物精品| 亚洲精品国产精品国自产观看浪潮| 国产精品www色诱视频| 久久综合久久美利坚合众国| 欧美激情网友自拍| 久久久精品一区| 欧美另类69精品久久久久9999| 午夜久久99| 欧美日产在线观看| 久久久久国产精品麻豆ai换脸| 欧美激情自拍| 亚洲激情另类| 亚洲视频大全| 在线精品在线| 亚洲一区二区三区视频播放| 精品不卡一区| 亚洲永久视频| 一区二区三区日韩欧美精品| 久久九九国产精品| 亚洲资源av| 欧美激情一区二区| 麻豆av福利av久久av| 国产精品毛片a∨一区二区三区| 欧美国产免费| 激情校园亚洲| 欧美影院午夜播放| 午夜视频一区二区| 欧美日韩国产精品一区| 欧美成人免费视频| 狠狠88综合久久久久综合网| 亚洲午夜国产一区99re久久 | 国产精品亚洲综合一区在线观看| 欧美成人黄色小视频| 国产欧美三级| 亚洲一区二区在线看| 一区二区三区久久久| 欧美激情视频免费观看| 欧美激情视频在线免费观看 欧美视频免费一 | 欧美一区二区三区久久精品| 欧美精品日本| 亚洲日本va午夜在线电影| 在线精品视频在线观看高清| 久久精品99久久香蕉国产色戒| 久久精品91| 国产一区二区三区四区在线观看| 午夜性色一区二区三区免费视频| 亚洲一区二区三区欧美| 欧美视频日韩视频在线观看| 亚洲精品欧美激情| 亚洲视频一区二区免费在线观看| 欧美激情综合亚洲一二区| 欧美国产日韩免费| 91久久夜色精品国产九色| 麻豆av一区二区三区久久| 欧美国产日韩一区二区三区| 亚洲欧洲一区二区三区在线观看| 免费看亚洲片| 99热在线精品观看| 午夜天堂精品久久久久 | 国产精品性做久久久久久| 一区二区三区波多野结衣在线观看| 亚洲视频碰碰| 国产亚洲网站| 欧美gay视频| 一区二区三区四区在线| 欧美一区二区三区喷汁尤物| 国产一区二区日韩精品欧美精品| 久久蜜桃香蕉精品一区二区三区| 亚洲国产精品ⅴa在线观看| 一二三区精品| 久久婷婷影院| 亚洲美女在线视频| 亚洲高清色综合| 亚洲国产成人一区| 亚洲精品久久| 亚洲欧美日韩一区二区三区在线观看| 欧美视频在线观看免费| 亚洲一区二区少妇| 欧美成人高清视频| 亚洲专区一区| 亚洲国产中文字幕在线观看| 欧美日韩中文字幕精品| 欧美一乱一性一交一视频| 亚洲国产精品黑人久久久| 亚洲欧美美女| 最新热久久免费视频| 国产精品免费看片| 蜜桃伊人久久| 亚洲欧美影院| 日韩视频免费| 亚洲第一级黄色片| 久久久91精品| 亚洲自拍偷拍麻豆| 亚洲日韩中文字幕在线播放| 国产伦精品一区二区| 欧美日韩大陆在线| 老鸭窝毛片一区二区三区| 亚洲免费在线| 亚洲最新在线视频| 亚洲激情视频在线播放| 久久久久中文| 久久成人18免费网站| 一区二区三区日韩欧美| 亚洲欧洲日产国产综合网| 国产一区二区三区视频在线观看| 国产精品播放| 国产精品v日韩精品| 欧美乱大交xxxxx| 欧美mv日韩mv国产网站| 久久久激情视频|