WDF驅動和3環通訊

2021-10-09 05:36:04 字數 3375 閱讀 6095

#ifndef ctl_code_h_89749_9961731

#define ctl_code_h_89749_9961731

#define ctl_buffered ctl_code(file_device_unknown,0x850,method_buffered,file_any_access)

//method_out_direct 該方式既可以使用輸入緩衝區.也可以使用輸出緩衝區

#define ctl_direct ctl_code(file_device_unknown,0x851,method_out_direct,file_any_access)

#endif

此驅動為支援pnp的驅動

採用method_buffered方式通訊時,獲取的輸入緩衝區可以當成輸出緩衝區使用,直接寫入值就可以返回給3環

而method_out_direct通訊方式,輸入緩衝區和輸出緩衝區是不一樣的,需要單獨獲取,才能給3環返回值

#include

"queue.h"

#include

"ioctl.h"

#include

"device.h"

#include

//i/o內部裝置控制

void evtiodevicecontrol

( _in_ wdfqueue queue,

_in_ wdfrequest request,

_in_ size_t outputbufferlength,

_in_ size_t inputbufferlength,

_in_ ulong iocontrolcode

)else

break

;case ctl_direct:

//獲取緩衝區

kdprint((

"進入ctl_direct方式處理請求\n"))

;//獲取緩衝區

wdfrequestretrieveinputbuffer

(request,1,

&buffer,

&length);if

(*buffer ==

0x13

)else

break

;default

:wdfrequestcompletewithinformation

(request, status_invalid_parameter,0)

;}}

// wdfuser.cpp : 定義控制台應用程式的入口點。

//#include

"stdafx.h"

#include

#include

#include

#include

#include

"ioctl.h"

#pragma comment(lib,"setupapi.lib")

define_guid

(wdf_guid,

0xb184f9a

,0xe875

,0x49c2

,0xb0

,0xdc

,0xcf

,0x58

,0xa8

,0x56

,0x1f

,0x8e);

//使用vs的生成guid工具,選擇第二種方式生成。

pwchar getdeviceviainte***ce

(const guid* pguid)

// get inte***ce data for the requested instance

sp_inte***ce_device_data ifdata;

ifdata.cbsize =

sizeof

(ifdata)

;//列舉裝置介面 乙個驅動裝置可以建立多個介面 插入乙個相同裝置就會建立乙個裝置介面.

// i 指定了多個裝置中的其中乙個裝置序號 如果沒有這個序號就會列舉失敗if(

!setupdienumdeviceinte***ces

(info,

null

, pguid,0,

&ifdata)

) dword reqlen;

//獲取指定介面的詳細資訊 主要是獲得reqlen

setupdigetdeviceinte***cedetail

(info,

&ifdata,

null,0

,&reqlen,

null);

//分配符號鏈結名長度的記憶體

psp_inte***ce_device_detail_data ifdetail =

(psp_inte***ce_device_detail_data)

(new char

[reqlen]);

if(ifdetail ==

null

)// get symbolic link name

ifdetail->cbsize =

sizeof

(sp_inte***ce_device_detail_data);if

(!setupdigetdeviceinte***cedetail

(info,

&ifdata, ifdetail, reqlen,

null

,null))

printf

("symbolic link is %s\n"

, ifdetail->devicepath)

;return ifdetail->devicepath;

}int

_tmain

(int argc, _tchar* ar**)

/* delete ifdetail;

setupdidestroydeviceinfolist(info);

*/ dword dwret =0;

char inbuffer[10]

=;dword inbuffersize =10;

uchar outbuffer[10]

=;dword outbuffersize =10;

deviceiocontrol

(hdevice, ctl_convert, inbuffer, inbuffersize,outbuffer ,outbuffersize,

&dwret,0)

;closehandle

(hdevice);if

(dwret>0)

getchar()

;return0;

}

WDF驅動開發 CONTEXT和IO QUEUE

wdf裡面,大多數物件都支援自定義的資料,比如給裝置物件建立乙個context。物件上下文 先自定義乙個結構,比如 typedef struct device context 裡面放了乙個物件wdfqueue.然後給裝置物件建立乙個上下文記憶體塊。在使用之前先要宣告一下這個結構,相當於告訴框架,我們...

上層和驅動通訊

上層和驅動通訊 用deviceiocontrol函式,這是乙個win32 api,在sdk中定義。這個函式都會產生乙個irp mj device control包,如果驅動中註冊過相應的例程,那麼這個包就會引發該例程的工作。如果是驅動和驅動間的通訊,那麼用iobuilddevicecontrolre...

WinCE 控制面板和驅動通訊

2.在驅動執行緒內部的死迴圈體呼叫waitforsingleobject 函式進行等待 dword winapi soclcd mybacklightchangethreadproc pvoid parg closehandle hevent return 0 3.接下來,我們來看看控制面板如何傳送...