【WHQL认证/HLK测试相关】写了一个UMDF驱动程序和触摸板进行收发数据,此时HLK测试不知该如何选择测试项(知道可以通过load playlist来获得测试项),操作时发现inf文件里写不同的Class,会有不同的测试项
提问:对于这个UMDF驱动程序,要进行WHQL认证的话,HLK测试应该怎么做,劳烦说的详细一点,这一块实在是不明白
WHQL这个要交钱给微软的,而且你直接问微软支持就可以了。
不知道怎么形容这个问题,其实和触摸板的通信还没做,但是领导让先搞清楚WHQL认证要怎么做,再根据测试需求去写代码
关于HLK测试,需要选择适合自己驱动程序的测试项进行测试。一般来说,可以根据驱动程序的功能和特点来选择测试项。例如,在你的情况下,你可以选择以下测试项进行测试:
对于inf文件中写不同的C的问题,可以根据驱动程序的特点和使用的语言来选择适合自己的C分类。例如,如果你使用的是C++语言,可以选择C++的C分类。如果你的驱动程序不需要使用COM接口,可以选择不使用COM的C分类。
下面是一个示例代码块,用于在inf文件中选择C分类:
[Version]
Signature="$WINDOWS NT$"
Class=MyDriverClass ;选择驱动程序所属的类别
ClassGuid={12345678-1234-1234-1234-123456789012} ;类别的GUID
Provider=%ManufacturerName%
CatalogFile=mydriver.cat ;安装时需要用到的CAT文件
[ClassInstall32]
Addreg=MyDriverClassReg
[MyDriverClassReg]
HKR,,,0,%ClassName%
HKR,,Icon,,-5
HKR,,Installer32,,"netr28u.inf:MyDriverClassInstaller32"
[DestinationDirs]
DefaultDestDir=12 ;system32\drivers
希望这些信息能对你有所帮助。
该回答参考ChatGPT:
要对UMDF驱动程序进行WHQL认证,需要使用HLK(Hardware Lab Kit)测试。在测试之前,您需要先创建一个符合要求的测试计划,并确保驱动程序已经完成了集成测试和兼容性测试。
为了选择适当的测试项,您需要根据驱动程序的功能和特点来选择相关的测试方案和测试用例。如果驱动程序与触摸板一起使用,则需要选择与其相关的测试用例。
另外,您提到INF文件中包含不同的Class会产生不同的测试项。这是因为每个设备类别都有自己的测试要求和测试用例。因此,要确保所选的测试方案和测试用例与驱动程序的类别相匹配,以便获得可靠的测试结果并通过WHQL认证。
总之,要进行WHQL认证,您需要使用HLK测试,并根据驱动程序的功能和特点选择适当的测试方案和测试用例,确保符合相应的测试要求。
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先,如果要进行WHQL认证,需要进行HLK测试。HLK测试是确保驱动程序符合Windows硬件质量实验室(WHQL)标准的测试过程。
为了进行HLK测试,需要安装HLK客户端,并准备好测试计算机和测试服务器。
下面是HLK测试的步骤:
通过HLK客户端,创建一个新的测试计划。在测试计划里,应该包含对驱动程序的所有测试项。
确保测试计算机完全符合测试要求。这包括要求的硬件配置、操作系统版本和补丁等等。
将测试设备添加到测试计划中。测试设备包括计算机系统和外部设备。
配置测试设备,以确保测试计划顺利进行。
运行测试计划。测试过程会自动通过HLK测试工具运行。
测试完成后,可以查看测试结果,并查看测试报告,以确保驱动程序符合WHQL标准。
至于如何选择测试项,可以根据驱动程序的用途和特性来选择对应的测试项。如果你的驱动程序是一个触摸板驱动程序,可以选择和输入设备相关的测试项,如汽车基线测试、会话测试、功能测试等等。
至于Inf文件中的Class,需要根据驱动程序的用途来选择正确的Class。选择正确的Class是非常重要的,因为它会影响到驱动程序可用的测试项。
以下是一个UMDF驱动程序和触摸板进行收发数据的示例代码:
#include <ntddk.h>
#include <wdf.h>
#include <initguid.h>
#include <wdmguid.h>
#define IOCTL_TCHDRIVER_SEND \
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(TCH_DEVICE_CONTEXT, Context);
typedef struct _TCH_DEVICE_CONTEXT {
WDFQUEUE Queue;
} TCH_DEVICE_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(TCH_REQUEST_CONTEXT, TCH_REQUEST_CONTEXT_GET_FROM_IO_REQUEST);
typedef struct _TCH_REQUEST_CONTEXT {
WDFMEMORY Memory;
} TCH_REQUEST_CONTEXT;
DRIVER_INITIALIZE DriverEntry;
EVT_WDF_DRIVER_DEVICE_ADD TchEvtDeviceAdd;
EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL TchEvtIoDeviceControl;
NTSTATUS
DriverEntry(
_In_ PDRIVER_OBJECT DriverObject,
_In_ PUNICODE_STRING RegistryPath
)
{
WDFDRIVER Driver;
NTSTATUS Status;
Status = WdfDriverCreate(DriverObject, RegistryPath, WDF_NO_OBJECT_ATTRIBUTES, WDF_NO_HANDLE, &Driver);
if (!NT_SUCCESS(Status)) {
return Status;
}
return STATUS_SUCCESS;
}
NTSTATUS
TchEvtDeviceAdd(
_In_ WDFDRIVER Driver,
_Inout_ PWDFDEVICE_INIT DeviceInit
)
{
UNREFERENCED_PARAMETER(Driver);
WDFDEVICE Device;
WDF_IO_QUEUE_CONFIG QueueConfig;
NTSTATUS Status;
Status = WdfDeviceCreate(&DeviceInit, WDF_NO_OBJECT_ATTRIBUTES, &Device);
if (!NT_SUCCESS(Status)) {
return Status;
}
WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&QueueConfig, WdfIoQueueDispatchSequential);
QueueConfig.EvtIoDeviceControl = TchEvtIoDeviceControl;
TCH_DEVICE_CONTEXT* Context = TCH_DEVICE_CONTEXT(Context);
Status = WdfIoQueueCreate(Device, &QueueConfig, WDF_NO_OBJECT_ATTRIBUTES, &Context->Queue);
if (!NT_SUCCESS(Status)) {
return Status;
}
return STATUS_SUCCESS;
}
NTSTATUS
TchEvtIoDeviceControl(
_In_ WDFQUEUE Queue,
_In_ WDFREQUEST Request,
_In_ size_t InputBufferLength,
_In_ size_t OutputBufferLength,
_In_ ULONG IoControlCode
)
{
UNREFERENCED_PARAMETER(InputBufferLength);
UNREFERENCED_PARAMETER(OutputBufferLength);
NTSTATUS Status;
TCH_REQUEST_CONTEXT* RequestContext = TCH_REQUEST_CONTEXT_GET_FROM_IO_REQUEST(Request);
switch (IoControlCode) {
case IOCTL_TCHDRIVER_SEND:
{
PVOID InputBuffer;
size_t InputBufferLength;
Status = WdfRequestRetrieveInputBuffer(Request, 0, &InputBuffer, &InputBufferLength);
if (!NT_SUCCESS(Status)) {
break;
}
TCH_DEVICE_CONTEXT* DeviceContext = TCH_DEVICE_CONTEXT_GET(WdfIoQueueGetDevice(Queue));
Status = WdfMemoryCopyFromBuffer(RequestContext->Memory, 0, InputBuffer, InputBufferLength);
if (!NT_SUCCESS(Status)) {
break;
}
WdfRequestComplete(Request, Status);
break;
}
default:
{
Status = STATUS_INVALID_DEVICE_REQUEST;
WdfRequestComplete(Request, Status);
break;
}
}
return Status;
}
这个代码实现了一个驱动程序的基本功能:接收发送到驱动程序的数据,然后将其传递给触摸板设备处。这是一个简化的驱动程序,只是为了演示HLK测试的流程。在实际开发中,需要针对具体的硬件设备进行驱动程序开发。
如果我的回答解决了您的问题,请采纳!
首先,为了进行WHQL认证,你需要使用HLK(Windows 硬件实验室工具包)进行测试。针对不同的驱动程序和设备类型,HLK提供了不同的测试项,以确保其符合Windows硬件质量标准。
在你的情况下,你编写了一个UMDF驱动程序和触摸板进行数据收发。首先,请确保你已经安装了最新版本的HLK测试工具,并且已经为你的驱动程序创建了正确的 INF 文件。之后,你需要选择测试服务器,然后在 HLK 界面中选中你的测试计划。
对于驱动程序的 WHQL 认证,你需要进行以下测试:
1.对于你的驱动程序,选择 "Device.Graphic" 测试类别,这个测试类别是用于图形设备的测试
2.在 HLK 界面中,找到 "Device.DevFundamental" 测试子类别,并执行其中的所有测试用例
3.执行 "Device.PowerManagement" 测试子类别,以确保驱动程序支持电源管理功能
4.接下来,执行 "Device.Storage" 测试类别下的所有测试用例,以确保驱动程序与存储驱动程序正确交互。
5.最后,执行 "System.Performance" 测试类别下的所有测试用例,以确保驱动程序在系统性能方面不会有任何问题。
在选择测试项时,你需要注意 INF 文件中的 Class 和 ClassGUID 信息。这些信息将指导 HLK 在测试中执行哪些测试用例。在确保 INF 文件中正确配置了 Class 和 ClassGUID 之后,你可以通过加载测试播放列表执行测试用例。
请注意,以上仅是对于UMDF驱动程序进行WHQL认证测试的一个基本指南,你可能还需要针对你的具体情况选择其他测试项,以确保你的驱动程序满足 Windows 硬件质量标准。