Delphi 控制WDM驱动程序

Delphi 控制WDM驱动程序 - delphi - gliethttp [ http://blog.chinaunix.net/u1/38994/showart_303312.html ] ... Delphi 控制WDM驱动程序
使用 Delphi 实现驱动程序的调用和控制有很大的意义和价值, Windows 操作系统提供了几个 API 函数实现应用程序和驱动程序的数据传输,其中最常用的就是 DeviceIoControl (),这个函数在 Delphi 中的定义原型为:

function DeviceIoControl(hDevice: THandle; dwIoControlCode: DWORD; 7

lpInBuffer: Pointer;nInBufferSize: DWORD; lpOutBuffer: Pointer; nOutBufferSize: DWORD;var lpBytesReturned: DWORD; lpOverlapped: POverlapped): BOOL; stdcall;

参数:

hDevice 设备句柄

dwIoControlCode 应用程序传递给驱动程序的控制码

lpInBuffer 应用程序传递给驱动的缓冲区

nInBufferSize 应用程序传递给驱动的数据大小

lpOutBuffer 驱动程序回传数据缓冲区

nOutBufferSize 应用程序希望驱动程序回传数据大小

lpBytesReturned 驱动程序实际回传数据大小

lpOverlapped 一般操作可以直接将其置成 nil

现在以读取设备描述符为例详细讲解 Delphi 如何实现驱动程序调用

// 打开以 devname 为符号链接名的 USB 设备驱动

// 因为 WDM 驱动中定义 'Glx-gliet- 7 05-05-25 ' 作为符号链接名,所以这里也必须用该

// 符号链接名代开 USB 驱动

function Tform1.UsbOpenDriver(var phDeviceHandle: THandle;const devname: string): boolean;

var completeDeviceName:array[0..63] of char;

begin

StrPCopy(completeDeviceName,'//./'+devname);

// completeDeviceName 为设备名,打开设备

phDeviceHandle:=CreateFile(completeDeviceName,GENERIC_WRITE,

FILE_SHARE_WRITE,nil,OPEN_EXISTING,

0,0);

if phDeviceHandle=INVALID_HANDLE_VALUE then

begin

result:=false;

end else

begin

result:=true;

end ;

end ;

// 读取 USB 设备描述符

procedure Tform1.Button1Click(Sender: TObject);

var hDevice:THandle;

output:USB_DEVICE_DESCRIPTOR;

nBytes:DWORD;

bResult:boolean;

begin

hDevice:=0;

// 打开符号链接名为 'Glx-gliet- 05-05-25 ' USB 驱动

If(not UsbOpenDriver(hDevice, 'Glx-gliet- 05-05-25 '))then

begin

exit;

end ;

// WDM 驱动发送“获取设备描述符”指令

bResult:=DeviceIoControl(hDevice,IOCTL_GlxD12_GET_DEVICE_DESCRIPTOR,nil,0,@output,sizeof(USB_DEVICE_DESCRIPTOR),nBytes,nil);

CloseHandle(hDevice);

end ;

首先调用函数 UsbOpenDriver 打开符号链接名为 'Glx-gliet- 05-05-25 ' USB 驱动程序, UsbOpenDriver 函数调用 Windows 提供的文件操作 API CreateFile ,把 USB 驱动设备打开,成功打开后,就可以对 USB 设备进行操作了,调用函数 DeviceIoControl 读取 USB 设备描述符,这样就实现了 USB 设备描述符的获取。

IOCTL_GlxD12_GET_DEVICE_DESCRIPTOR 为应用程序 GlxARM 传递给驱动程序的控制命令参数,其定义为:

const IOCTL_GlxD12_GET_DEVICE_DESCRIPTOR

= (FILE_DEVICE_UNKNOWN shl 16) or(FILE_ANY_ACCESS shl 14) or

((GlxD12_IOCTL_INDEX+0) shl 2)or(METHOD_BUFFERED);

发表于: 2007-05-17,修改于: 2007-05-17 15:09,已浏览1111次,有评论0条 推荐 投诉 ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值