本周时间比较松,花点时间玩了下USB驱动,入门而已,驱动开发肯定不会如此简单的
下周开始搞以太网移植,没时间玩了
平台:VC++6.0 + DDK_xp + DriverStudio3.2
驱动部分:
1、安装顺序:VC->DDK->DriverStudio
2、安装DDK后Build Environment
3、安装DriverStudio后,打开../DriverWorks/Source 目录下的VC工程,编译生成vdw_wdm.lib
4、使用DriverWizard生成驱动,编译的时候注意设置DDK的路径
5、关于ntstrsafe.lib和csq.lib, 在sources文件中去掉即可
6、Initialize的Bug,将10进制改为16进制:
将
Pipe1.Initialize(m_Lower, 1, 64);
Pipe2.Initialize(m_Lower, 82, 64);
Pipe3.Initialize(m_Lower, 83, 64);
改为:
Pipe1.Initialize(m_Lower, 0x1, 64);
Pipe2.Initialize(m_Lower, 0x82, 64);
Pipe3.Initialize(m_Lower, 0x83, 64);
7、DriverWizard只是生成的一个驱动框架,还需要自己添加一些实现代码:
如将NTSTATUS LED_DRVDevice::WritePipe1_Handler(KIrp I)函数改为如下:
NTSTATUS status = STATUS_SUCCESS;
ULONG inputSize = I.IoctlInputBufferSize();
ULONG outputSize = I.IoctlOutputBufferSize();
PVOID inputBuffer = I.IoctlBuffer();
PVOID outputBuffer = NULL;
I.Information() = 0;
if (inputBuffer == NULL)
{
status = STATUS_INVALID_PARAMETER;
}
else
{
// TODO: copy data
PURB pUrb=Pipe1.BuildInterruptTransfer(inputBuffer,inputSize, FALSE,NULL,NULL); if(pUrb==NULL)
{
status=STATUS_INSUFFICIENT_RESOURCES;
}
else
{
status=Pipe1.SubmitUrb(pUrb,NULL,this,1000);
I.Information() = pUrb->UrbBulkOrInterruptTransfer.TransferBufferLength;
delete pUrb;
}
}
STATUS %x/n", I, status);
return status;
应用程序部分:
1、GUID,使用驱动生成的GUID,可以直接使用驱动的interface.h这个文件
2、需要的头文件: #include <setupapi.h>
#include <basetyps.h>
#pragma comment(lib, “Setupapi.lib”)
#include <winioctl.h>
3、这部分是个人理解,仅参考,步骤如下:
a、hardwareDeviceInfo=SetupDiGetClassDevs(pGuid,
NULL,
NULL, // Define no
(DIGCF_PRESENT | // Only Devices present
DIGCF_INTERFACEDEVICE), 将GUID传入获得相关硬件信息
b、SetupDiEnumDeviceInterfaces ( hardwareDeviceInfo,
0, // We don't care about specific PDOs
pGuid,
NumberDevices,
&deviceInfoData), 枚举对应此信息的所有Device
c、SetupDiGetInterfaceDeviceDetail(hardwareDeviceInfo,
&deviceInfoData,
NULL, // probing so no output buffer yet
0, // probing so output buffer length of zero
&requiredLength,
NULL), 第一次调用此函数,获得Device长度
d、SetupDiGetInterfaceDeviceDetail(hardwareDeviceInfo,
&deviceInfoData,
functionClassDeviceData,
predictedLength,
&requiredLength,
NULL), 第二次调用此函数,获得Device名称
e、m_pipe =CreateFile( PipeName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL), 使用获得的Device名称获得句柄
f、DeviceIoControl(m_pipe, WritePipe1, Send_Msg, 64, NULL, 0, &lpsize, NULL),使用此函数写Pipe1