将驱动移植到64位Windows操作系统

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

将驱动移植到64位Windows操作系统

x64位操作系统和x32位操作系统的最大区别就是内存寻址方式的不同。而64位操作系统不支持32位的驱动程序,因为驱动程序和windows内核同处于一个地址空间中。这是移植32位驱动到64位驱动的最大原因。当然,64位驱动程序可以使用更大的分页内存,非分页内存及系统缓存。而且,你的设备从此就支持64位windows操作系统了。

1.在X64下的驱动程序安装

除了要把应用程序的32位驱动程序变成64位程序之外,驱动的安装程序和其它配置文件同样需要修改。也就是说,对于要在x64上运行的32位程序,它所依赖的驱动仍然需要是64位的。这些相关程序包括inf文件,device installers, class installers和co-installers。相关资料可查看MSDN Libarary DDK:Porting Your Driver to 64-Bit Windows。

所以,要改造应用程序的安装程序。方法是,让32位版的驱动安装为缺省安装选项,即用户插入安装光盘之后,依然运行32位安装程序。但当程序调用UpdateDriverForPlugAndPlayDevices返回值为ERROR_IN_WOW64时,这说明该安装程序正运行在64位Windows环境中。此时,这个安装程序应该调用CreateProcess函数来启动64位的安装进程。这个64位的安装进程通过调用64位驱动目录下的inf文件进行驱动安装。

2.驱动要支持32位IOCTL

某些IOCTL可能包含含有指针的结构,所以,要特别小心的区别对待它,必须根据被调用者解析结构或者输出结构。

有三种办法可以解决这个问题:

1.尽量避免使用IOCTL传递包含有指针的结构;

2.通过API IoIs32bitProcess()来判断上层调用者的程序类型;

3.在64位程序中采用新的IOCTL命令;

例子:

IOCTL structure in header file

typedef struct _IOCTL_PARAMETERS {

PVOID Addr;

SIZE_T Length;

HANDLE Handle;

} IOCTL_PARAMETERS, *PIOCTL_PARAMETERS;

32-bit IOCTL structure

//

// This structure is defined

// inside the driver source code

//

typedef struct _IOCTL_PARAMETERS_32 {

VOID*POINTER_32 Addr;

INT32 Length;

VOID*POINTER_32 Handle;

} IOCTL_PARAMETERS_32, *PIOCTL_PARAMETERS_32;

32-Bit and 64-Bit IOCTL

#ifdef _WIN64

case IOCTL_REGISTER:

if (IoIs32bitProcess(Irp)) {

/* If this is a 32 bit process */

params32 = (PIOCTL_PARAMETERS_32)(Irp>AssociatedIrp.SystemBuffer);

if(irpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(IOCTL_PARAMETERS_32)) {

status = STATUS_INVALID_PARAMETER;

} else {

LocalParam.Addr = params32->Addr;

LocalParam.Handle = params32->Handle;

LocalParam.Length = params32->Length;

/* Handle the ioctl here */

status = STATUS_SUCCESS;

Irp->rmation = sizeof(IOCTL_PARAMETERS);

}

} else { /* 64bit process IOCTL */

} else { /* 64bit process IOCTL */

params = (PIOCTL_PARAMETERS)

(Irp->AssociatedIrp.SystemBuffer);

if (irpSp->Parameters.DeviceIoControl.InputBufferLength

< sizeof(IOCTL_PARAMETERS)) {

status = STATUS_INVALID_PARAMETER;

} else {

RtlCopyMemory(&LocalParam, params,

sizeof(IOCTL_PARAMETERS));

/* Handle the ioctl here */

status = STATUS_SUCCESS;

}

Irp->rmation = sizeof(IOCTL_PARAMETERS);

}

break;

3.64-Bit INF 文件要求

在Windows Server 2003SP1之后,64位驱动的安装被提高了要求。这可以简化用户的操作及提高安全性。

Inf文件中必须含有NTAmd64或者NTIA64之类的修饰符才行。具体做法是在[Manufacturer]和Models小节都需要添加此类的字段。

[Manufacturer]

%mycompany% = MyCompanyModels

[MyCompanyModels]

%MyDev% = mydevInstall,mydevHwid

相关文档
最新文档