阅读:1652回复:6
怎样在驱动中指定特定的安装串口号?
请问怎样更改在设备列表中显示的串口名(comX,好像是系统安装串口时顺序排下来的),使其和驱动中的相同?
|
|
沙发#
发布于:2004-02-26 09:11
哦! 我是在自动安装程序里改的:修改注册表硬件部分FriendlyName
SetupDiSetDeviceRegistryProperty( DeviceInfoSet, // 修改FriendlyName pDeviceInfoData, SPDRP_FRIENDLYNAME, (UCHAR*)szFriendlyName, lstrlen(szFriendlyName) ) ) |
|
板凳#
发布于:2004-02-25 21:03
已经修改了,感觉设备管理器显示的不是由这个值取得的。
现在想通过应用来访问注册表实现,发现在调用函数 RegQueryValueEx时读不出portname名,返回ERROR_MORE_DATA,而我在驱动中指定的名字是COMX。 (用RegQueryValueEx调用应该没用错,因为可顺利获取其他串口的名字) 不知是何原因? |
|
地板#
发布于:2004-02-25 15:31
看看注册表里硬件部分的"PortName"是否已经被修改了
|
|
地下室#
发布于:2004-02-22 18:09
按照您的方法试了,不行啊?设备列表中显示的还是系统顺序排列的,我打开注册表后,调
ZwSetValueKey(Handle, &keyname, 0, Dtype, PData, DataLength); 返回值显示已经设置成功了??? 是不是只能再作个 DLL实现该功能呀?请指教 |
|
5楼#
发布于:2004-02-20 16:28
!! 有些字符不给贴?
/* 更改串口名字 enum\....\xxx\ Device Parameters\PortName 这个值在 PLUGPLAY_REGKEY_DEVICE 里 */ NTSTATUS InitUpdateCommPortName( IN PDEVICE_OBJECT pDeviceObject, IN PUNICODE_STRING pPortName ) { NTSTATUS Status; HANDLE hKeyDevice; // 注册表的HKEY Status = IoOpenDeviceRegistryKey( pDeviceObject, // 打开Class\xxx注册表 PLUGPLAY_REGKEY_DEVICE, STANDARD_RIGHTS_WRITE, &hKeyDevice ); if( !NT_SUCCESS(Status) ) { return Status; } Status = InitPutRegistryKeyValue( hKeyDevice, // 写入注册表 L"PortName", sizeof(L"PortName"), REG_SZ, pPortName->Buffer + sizeof("\\DosDevice\\"), pPortName->Length + sizeof(WCHAR) ); ZwClose( hKeyDevice ); return Status; } /* 把一个键值写入注册表里,照抄 DDK */ NTSTATUS InitPutRegistryKeyValue(IN HANDLE Handle, // handle IN PWCHAR PKeyNameString, // 键的名字 IN ULONG KeyNameStringLength, // 键的名字的长度 IN ULONG Dtype, // 类型 IN PVOID PData, // 值 IN ULONG DataLength ) // 值长度 { NTSTATUS status; UNICODE_STRING keyname; RtlInitUnicodeString(&keyname, NULL); keyname.MaximumLength = (USHORT)(KeyNameStringLength + sizeof(WCHAR)); keyname.Buffer = ExAllocatePool(PagedPool, keyname.MaximumLength); if( keyname.Buffer == NULL ) { return STATUS_INSUFFICIENT_RESOURCES; } RtlAppendUnicodeToString(&keyname, PKeyNameString); status = ZwSetValueKey(Handle, &keyname, 0, Dtype, PData, DataLength); ExFreePool(keyname.Buffer); return status; } |
|
6楼#
发布于:2004-02-20 16:24
// 在AddDevice里调用函数,改串口名字
/* 更改串口名字 enum\....\00x\ Device Parameters\PortName 这个值在 PLUGPLAY_REGKEY_DEVICE 里 */ NTSTATUS InitUpdateCommPortName( IN PDEVICE_OBJECT pDeviceObject, IN PUNICODE_STRING pPortName ) { NTSTATUS Status; HANDLE hKeyDevice; // 注册表的HKEY Status = IoOpenDeviceRegistryKey( pDeviceObject, // 打开Class\xxx注册表 PLUGPLAY_REGKEY_DEVICE, STANDARD_RIGHTS_WRITE, &hKeyDevice ); if( !NT_SUCCESS(Status) ) { return Status; } Status = InitPutRegistryKeyValue( hKeyDevice, // 写入注册表 L"PortName", sizeof(L"PortName"), REG_SZ, pPortName->Buffer + sizeof("\\DosDevice\\"), pPortName->Length + sizeof(WCHAR) ); ZwClose( hKeyDevice ); return Status; } /* 把一个键值写入注册表里,照抄 DDK */ NTSTATUS InitPutRegistryKeyValue(IN HANDLE Handle, // handle IN PWCHAR PKeyNameString, // 键的名字 IN ULONG KeyNameStringLength, // 键的名字的长度 IN ULONG Dtype, // 类型 IN PVOID PData, // 值 IN ULONG DataLength ) // 值长度 { NTSTATUS status; UNICODE_STRING keyname; RtlInitUnicodeString(&keyname, NULL); keyname.MaximumLength = (USHORT)(KeyNameStringLength + sizeof(WCHAR)); keyname.Buffer = ExAllocatePool(PagedPool, keyname.MaximumLength); if( keyname.Buffer == NULL ) { return STATUS_INSUFFICIENT_RESOURCES; } RtlAppendUnicodeToString(&keyname, PKeyNameString); status = ZwSetValueKey(Handle, &keyname, 0, Dtype, PData, DataLength); ExFreePool(keyname.Buffer); return status; } |
|