原来真可以10分钟开发USB驱动

本周时间比较松,花点时间玩了下USB驱动,入门而已,驱动开发肯定不会如此简单的

下周开始搞以太网移植,没时间玩了

 

 

平台:VC++6.0 + DDK_xp + DriverStudio3.2

 

驱动部分:

1、安装顺序:VC->DDK->DriverStudio

2、安装DDKBuild Environment

3、安装DriverStudio后,打开../DriverWorks/Source 目录下的VC工程,编译生成vdw_wdm.lib

4、使用DriverWizard生成驱动,编译的时候注意设置DDK的路径

5、关于ntstrsafe.libcsq.lib sources文件中去掉即可

6InitializeBug,将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);

7DriverWizard只是生成的一个驱动框架,还需要自己添加一些实现代码:

   如将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;

 

应用程序部分:

1GUID,使用驱动生成的GUID,可以直接使用驱动的interface.h这个文件

2、需要的头文件: #include <setupapi.h>

                  #include <basetyps.h>

                  #pragma comment(lib, “Setupapi.lib”)

                  #include <winioctl.h>

3、这部分是个人理解,仅参考,步骤如下:

ahardwareDeviceInfo=SetupDiGetClassDevs(pGuid,

                                                     NULL,

                                                     NULL,            // Define no

                                                     (DIGCF_PRESENT | // Only Devices present

                                                     DIGCF_INTERFACEDEVICE), GUID传入获得相关硬件信息

bSetupDiEnumDeviceInterfaces ( hardwareDeviceInfo,

                                                                    0, // We don't care about specific PDOs

                                                                    pGuid,

                                                                    NumberDevices,

                                                                    &deviceInfoData), 枚举对应此信息的所有Device

cSetupDiGetInterfaceDeviceDetail(hardwareDeviceInfo,

                                                                    &deviceInfoData,

                                                                    NULL,  // probing so no output buffer yet

                                                                    0,     // probing so output buffer length of zero

                                                                    &requiredLength,

                                                                    NULL), 第一次调用此函数,获得Device长度

dSetupDiGetInterfaceDeviceDetail(hardwareDeviceInfo,

                                                                    &deviceInfoData,

                                                                    functionClassDeviceData,

                                                                    predictedLength,

                                                                    &requiredLength,

                                                                    NULL), 第二次调用此函数,获得Device名称

em_pipe =CreateFile( PipeName,

                                               GENERIC_READ | GENERIC_WRITE,

                                               FILE_SHARE_READ|FILE_SHARE_WRITE,

                                               NULL,

                                               OPEN_EXISTING,

                                               0,

                                               NULL), 使用获得的Device名称获得句柄

fDeviceIoControl(m_pipe, WritePipe1, Send_Msg, 64, NULL, 0, &lpsize, NULL)使用此函数写Pipe1

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值