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

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

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

常用鏈接

留言簿(17)

隨筆分類(138)

隨筆檔案(137)

網絡開發

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 501927
  • 排名 - 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>
            av成人免费在线| 亚洲三级性片| 久久久久久穴| 欧美在线免费看| 性欧美video另类hd性玩具| 亚洲香蕉在线观看| 亚洲欧美福利一区二区| 午夜久久tv| 久久久精品国产99久久精品芒果| 久久精品国产v日韩v亚洲| 麻豆成人综合网| 欧美激情区在线播放| 国产精品女主播| 国内自拍视频一区二区三区| 亚洲欧洲精品一区二区三区| 亚洲伊人网站| 欧美wwwwww| 一本色道久久综合亚洲精品小说| 午夜综合激情| 欧美精品久久久久久久| 国产日本亚洲高清| 亚洲精品一区二区三区婷婷月| 亚洲欧美日韩一区二区三区在线| 国产精品区一区二区三区| 国产丝袜一区二区| 影音先锋中文字幕一区| 在线亚洲精品福利网址导航| 久久五月天婷婷| 一级日韩一区在线观看| 久久久91精品国产| 国产精品成人久久久久| 亚洲国产欧美精品| 久久精彩免费视频| 在线视频欧美精品| 欧美不卡三区| 在线播放日韩专区| 欧美诱惑福利视频| 一区二区高清视频| 欧美日韩亚洲综合| 日韩一级欧洲| 欧美国产日韩在线| 久久精品综合网| 国产欧美在线看| 亚洲一区自拍| 一区二区三区黄色| 欧美日本三区| 日韩一区二区久久| 亚洲国产电影| 久久久久久久久伊人| 国产日韩欧美自拍| 欧美一级欧美一级在线播放| 亚洲免费电影在线| 欧美日韩成人综合| 国产精品99久久久久久宅男 | 久久蜜桃香蕉精品一区二区三区| 国产精品国产三级国产a| 亚洲激情偷拍| 欧美激情精品久久久久久久变态| 久久精品电影| 一区国产精品| 欧美黄在线观看| 欧美凹凸一区二区三区视频| 亚洲黄色一区| 亚洲三级影院| 欧美午夜宅男影院| 欧美一区二区三区视频在线| 欧美一级夜夜爽| 国产日韩在线一区| 久久黄色网页| 久久免费精品日本久久中文字幕| …久久精品99久久香蕉国产| 免费观看不卡av| 欧美成年视频| 亚洲免费一区二区| 欧美一区成人| 1769国内精品视频在线播放| 欧美国产日韩一区二区在线观看 | 久久精品国产亚洲精品| 麻豆精品网站| 亚洲毛片网站| 亚洲一级黄色| 在线观看91久久久久久| 亚洲高清在线| 国产精品久久久久三级| 久久久无码精品亚洲日韩按摩| 久久嫩草精品久久久精品一| 99国产精品久久久久久久久久| 亚洲性图久久| 亚洲国产精品成人综合| 日韩视频免费看| 国产午夜精品美女视频明星a级| 玖玖玖国产精品| 欧美视频免费看| 毛片一区二区| 国产精品欧美日韩久久| 欧美国产精品va在线观看| 国产精品国产三级国产专播品爱网| 久久久久久精| 欧美日韩一区二区在线播放| 久久―日本道色综合久久| 欧美人与禽性xxxxx杂性| 性伦欧美刺激片在线观看| 在线精品国产成人综合| 99视频精品免费观看| 亚洲一区综合| 亚洲激情网站| 亚洲欧美乱综合| 在线午夜精品| 久久亚洲高清| 久久久久亚洲综合| 国产精品免费在线| 亚洲二区在线观看| 国产综合视频在线观看| 9l国产精品久久久久麻豆| 亚洲国产欧美一区二区三区久久| 亚洲欧美日韩综合国产aⅴ| 99国产精品久久久久久久成人热| 久久www成人_看片免费不卡| 99在线精品观看| 欧美成人精品| 免费一区视频| 精品福利av| 久久激情五月激情| 欧美在线亚洲一区| 国产日韩专区| 欧美有码在线视频| 欧美在线观看天堂一区二区三区| 欧美日韩一本到| 亚洲精选在线| 亚洲午夜日本在线观看| 欧美高清视频免费观看| 欧美va天堂va视频va在线| 激情欧美亚洲| 久久久久九九视频| 免费在线观看日韩欧美| 1024亚洲| 久久资源在线| 亚洲福利在线观看| 亚洲精品一区在线观看| 欧美成人在线影院| 亚洲国产网站| 99国产精品99久久久久久| 免费成人av在线看| 亚洲国产精品国自产拍av秋霞| 亚洲黄色尤物视频| 亚洲国产日韩欧美综合久久| 亚洲区欧美区| 欧美日韩免费看| 亚洲新中文字幕| 久久精品在这里| 亚洲高清色综合| 欧美成年视频| 亚洲一区二区精品视频| 久久精品国产一区二区电影| 136国产福利精品导航网址应用| 免费欧美日韩国产三级电影| 久久视频国产精品免费视频在线| 亚洲另类一区二区| 久久久久国产一区二区| 国产一区二区黄| 久久午夜视频| 亚洲国产一区在线观看| 亚洲网在线观看| 国产日韩欧美一区二区| 久久人人97超碰人人澡爱香蕉 | 欧美韩日一区二区三区| 一本色道久久| 国产九九精品视频| 久久一区二区三区四区五区| 亚洲日韩欧美一区二区在线| 欧美影院精品一区| 亚洲激情综合| 国产精品一区二区三区久久久| 久久视频精品在线| 一区二区三区日韩欧美| 欧美1区免费| 亚洲女爱视频在线| 91久久精品一区二区三区| 国产精品任我爽爆在线播放| 久久综合影视| 亚洲欧美在线网| 亚洲蜜桃精久久久久久久| 久热爱精品视频线路一| 亚洲女性裸体视频| 亚洲日本成人在线观看| 国产亚洲综合在线| 欧美色综合天天久久综合精品| 久热精品在线视频| 性一交一乱一区二区洋洋av| 亚洲精品中文字| 欧美高清视频一二三区| 久久久亚洲高清| 欧美一区二区三区四区夜夜大片 | 一区二区三区波多野结衣在线观看| 国产老肥熟一区二区三区| 欧美另类久久久品| 美国十次成人| 久久久亚洲欧洲日产国码αv | 欧美一级在线视频| 99综合视频|