sunhekun
驱动牛犊
驱动牛犊
  • 注册日期2003-05-14
  • 最后登录2004-09-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1652回复:6

怎样在驱动中指定特定的安装串口号?

楼主#
更多 发布于:2004-02-20 11:42
请问怎样更改在设备列表中显示的串口名(comX,好像是系统安装串口时顺序排下来的),使其和驱动中的相同?
qinxg
驱动小牛
驱动小牛
  • 注册日期2002-11-15
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分37分
  • 威望27点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-02-26 09:11
哦! 我是在自动安装程序里改的:修改注册表硬件部分FriendlyName
SetupDiSetDeviceRegistryProperty(  DeviceInfoSet, // 修改FriendlyName
pDeviceInfoData,
SPDRP_FRIENDLYNAME,
(UCHAR*)szFriendlyName,
lstrlen(szFriendlyName) ) )
sunhekun
驱动牛犊
驱动牛犊
  • 注册日期2003-05-14
  • 最后登录2004-09-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-02-25 21:03
已经修改了,感觉设备管理器显示的不是由这个值取得的。
现在想通过应用来访问注册表实现,发现在调用函数
RegQueryValueEx时读不出portname名,返回ERROR_MORE_DATA,而我在驱动中指定的名字是COMX。
(用RegQueryValueEx调用应该没用错,因为可顺利获取其他串口的名字)
不知是何原因?
qinxg
驱动小牛
驱动小牛
  • 注册日期2002-11-15
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分37分
  • 威望27点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-02-25 15:31
看看注册表里硬件部分的"PortName"是否已经被修改了
sunhekun
驱动牛犊
驱动牛犊
  • 注册日期2003-05-14
  • 最后登录2004-09-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-02-22 18:09
按照您的方法试了,不行啊?设备列表中显示的还是系统顺序排列的,我打开注册表后,调
ZwSetValueKey(Handle, &keyname, 0, Dtype, PData, DataLength);

返回值显示已经设置成功了???
是不是只能再作个 DLL实现该功能呀?请指教
qinxg
驱动小牛
驱动小牛
  • 注册日期2002-11-15
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分37分
  • 威望27点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
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;
}
qinxg
驱动小牛
驱动小牛
  • 注册日期2002-11-15
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分37分
  • 威望27点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
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;
}
游客

返回顶部