#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.接下來,我們來看看控制面板如何傳送...