阅读:2278回复:5
有关于虚拟串口的问题,了解的请回贴
这段时间在写虚拟串口的驱动程序,可是我试了好多次都无法在设备管理器里添加一个串口,是否要注册串口?还是有别的方法?我看了ddk,可是看不明白这一部分。有知道的请帮忙回贴啊,谢了谢了。
|
|
最新喜欢:idbee |
沙发#
发布于:2002-03-06 12:41
在INF文件中指定Class = SerailPort,在驱动程序中使用IoCreateDevice带FILE_DEVICE_SERIAL_PORT参数。
|
|
|
板凳#
发布于:2002-03-07 13:40
多谢回答。
我还有一事不明(很简单的):在inf文件的model字段中,要给出设备的id,《win2000设备驱动程序设计指南》(jerry lozano)的第十六章中说“将inf文件中的一项与新安装的设备返回的设备id匹配是一件很简单的事情”。可是这件“很简单的事情”我还是做不到(有点苯^_^),我在ddk里也没有找到这个方面的说明。 我想知道对虚拟串口(win2k下)来说,这个设备id如何得到?在IoCreateDevice例程建立设备对象得到?还有这个虚拟串口是哪个总线的设备?如果这些问题无法解决,我就无法通过inf文件装上这个虚拟串口。 如果有人愿意回答,我一定给分!!! |
|
地板#
发布于:2002-03-07 18:17
上次回答有误,Class应该是Ports,至于ID号,请参阅C:\\windows\\inf\\MsPorts.inf文件,里面有标准ID,还有很多厂商ID。如果你是虚拟串口,应该可以任意写一ID试试。
|
|
|
地下室#
发布于:2003-07-30 16:49
赶快作吧,大家都需要
NTSTATUS AddDevice(IN PDRIVER_OBJECT pDrvObj, IN PDEVICE_OBJECT pPhysicalDevObj) { NTSTATUS status; PLIST_ENTRY pListEntry; UNICODE_STRING instanceStr; WCHAR instanceNumberBuffer[20]; PDEVICE_OBJECT pCommDevObj; PCOMM_DEVICE_EXTENSION pDevExt; UNICODE_STRING ntDeviceName; PUNICODE_STRING pSymbolicName; HANDLE hReg; WCHAR* pRegName; REG_COM_PORT_PARAMS comPortParams; PAGED_CODE(); // // get default modes (raw/cooked, active/passive connections) // status = IoOpenDeviceRegistryKey(pPhysicalDevObj, PLUGPLAY_REGKEY_DEVICE, STANDARD_RIGHTS_READ, &hReg); if (!NT_SUCCESS(status)) return status; if (!NT_SUCCESS(IrCOMMGetRegistryKeyValue(hReg, L\"PortMode\", &comPortParams.defaultMode, sizeof(ULONG)))) comPortParams.defaultMode = SET_ACTIVE_CONN_MODE | SET_COOKED_MODE; // // determine instance number // comPortParams.instanceNo = 0; // ==> devListMutex KeWaitForMutexObject(&globals.devListMutex, Executive, KernelMode, FALSE, NULL); pListEntry = globals.devList.Flink; while (pListEntry != &globals.devList) { if (comPortParams.instanceNo < ((PCOMM_DEVICE_EXTENSION)pListEntry)->instanceNo) break; comPortParams.instanceNo = ((PCOMM_DEVICE_EXTENSION)pListEntry)->instanceNo + 1; pListEntry = pListEntry->Flink; } // // build device name // RtlZeroMemory(&ntDeviceName, sizeof(UNICODE_STRING)); ntDeviceName.MaximumLength = 128*sizeof(WCHAR); ntDeviceName.Buffer = ExAllocatePool(PagedPool, (128+1)*sizeof(WCHAR)); if (ntDeviceName.Buffer == NULL) { KeReleaseMutex(&globals.devListMutex, FALSE); // <== devListMutex status = STATUS_INSUFFICIENT_RESOURCES; goto ErrorAddDevice1; } RtlZeroMemory(ntDeviceName.Buffer, (128+1)*sizeof(WCHAR)); RtlAppendUnicodeToString(&ntDeviceName, COMM_NT_DEVICE_NAME); RtlInitUnicodeString(&instanceStr, NULL); instanceStr.MaximumLength = sizeof(instanceNumberBuffer); instanceStr.Buffer = instanceNumberBuffer; RtlIntegerToUnicodeString(comPortParams.instanceNo, 10, &instanceStr); RtlAppendUnicodeStringToString(&ntDeviceName, &instanceStr); // // create device object and register in devList // status = IoCreateDevice(pDrvObj, sizeof(COMM_DEVICE_EXTENSION), &ntDeviceName, FILE_DEVICE_SERIAL_PORT, 0, TRUE, &pCommDevObj); if (!NT_SUCCESS(status)) { KeReleaseMutex(&globals.devListMutex, FALSE); // <== devListMutex ExFreePool(ntDeviceName.Buffer); goto ErrorAddDevice1; } pDevExt = (PCOMM_DEVICE_EXTENSION)pCommDevObj->DeviceExtension; pDevExt->instanceNo = comPortParams.instanceNo; InsertHeadList(pListEntry, &pDevExt->listEntry); comPortParams.context = pDevExt; ExNotifyCallback(globals.pRegisterCallback, (PVOID)REGISTER_COM_PORT, &comPortParams); KeReleaseMutex(&globals.devListMutex, FALSE); // <== devListMutex RtlCopyMemory(&pDevExt->ntDeviceName, &ntDeviceName, sizeof(UNICODE_STRING)); // // set symbolic name (\\DosDevice\\COMx) // pRegName = ExAllocatePool(PagedPool, (128+1)*sizeof(WCHAR)); if (pRegName == NULL) { status = STATUS_INSUFFICIENT_RESOURCES; goto ErrorAddDevice2; } pSymbolicName = &pDevExt->symbolicLinkName; pSymbolicName->MaximumLength = 128*sizeof(WCHAR); pSymbolicName->Buffer = ExAllocatePool(PagedPool, (128+1)*sizeof(WCHAR)); if (pSymbolicName->Buffer == NULL) { status = STATUS_INSUFFICIENT_RESOURCES; goto ErrorAddDevice3; } status = IrCOMMGetRegistryKeyValue(hReg, L\"PortName\", pRegName, 128*sizeof(WCHAR)); if (!NT_SUCCESS(status)) goto ErrorAddDevice3; RtlZeroMemory(pSymbolicName->Buffer, (128+1)*sizeof(WCHAR)); RtlAppendUnicodeToString(pSymbolicName, L\"\\\\DosDevices\\\\\"); RtlAppendUnicodeToString(pSymbolicName, pRegName); status = IoCreateSymbolicLink(pSymbolicName, &ntDeviceName); if (!NT_SUCCESS(status)) goto ErrorAddDevice3; pDevExt->symbolicLinkSet = TRUE; // // register port in DeviceMap // status = RtlWriteRegistryValue(RTL_REGISTRY_DEVICEMAP, SERIAL_DEVICE_MAP, ntDeviceName.Buffer, REG_SZ, pRegName, (wcslen(pRegName) + 1) * sizeof(WCHAR)); if (!NT_SUCCESS(status)) goto ErrorAddDevice3; pDevExt->createdDeviceMapEntry = TRUE; // // register interface // status = IoRegisterDeviceInterface(pPhysicalDevObj, (LPGUID)&GUID_CLASS_COMPORT, NULL, &pDevExt->interfaceName); if (!NT_SUCCESS(status)) { pDevExt->interfaceName.Buffer = NULL; goto ErrorAddDevice3; } status = IoSetDeviceInterfaceState(&pDevExt->interfaceName, TRUE); if (!NT_SUCCESS(status)) goto ErrorAddDevice3; // // cleanup // ExFreePool(pRegName); ZwClose(hReg); // // remainig initializations // pDevExt->defaultMode = comPortParams.defaultMode; pCommDevObj->Flags |= DO_POWER_PAGABLE + DO_BUFFERED_IO; pDevExt->pSelf = pPhysicalDevObj; pDevExt->pNextLowerDriver = IoAttachDeviceToDeviceStack(pCommDevObj, pPhysicalDevObj); if (pDevExt->pNextLowerDriver == NULL) { DeleteDevice(pCommDevObj); return STATUS_NO_SUCH_DEVICE; } pDevExt->attached = TRUE; KeInitializeMutex(&pDevExt->openMutex, 0); InitializeListHead(&pDevExt->commReadQueue); KeInitializeSpinLock(&pDevExt->commReadSpinLock); InitializeListHead(&pDevExt->commWriteQueue); KeInitializeSpinLock(&pDevExt->commWriteSpinLock); KeInitializeSpinLock(&pDevExt->commControlSpinLock); InitTimer(&pDevExt->readIntervalTimer, ReadIntervalTimeout, pDevExt); InitTimer(&pDevExt->readTotalTimer, ReadTotalTimeout, pDevExt); InitTimer(&pDevExt->writeTotalTimer, WriteTotalTimeout, pDevExt); pDevExt->commHandflow.ControlHandShake = SERIAL_DTR_CONTROL; pDevExt->commHandflow.FlowReplace = SERIAL_RTS_CONTROL; // // finished // pCommDevObj->Flags &= ~DO_DEVICE_INITIALIZING; return STATUS_SUCCESS; ErrorAddDevice3: ExFreePool(pRegName); ErrorAddDevice2: DeleteDevice(pCommDevObj); ErrorAddDevice1: ZwClose(hReg); return status; } |
|
5楼#
发布于:2003-07-30 16:58
; IrCOMM2k.inf
; ; Installation file for the Virtual Infrared-COM-Port ; ; (c) Copyright 2001, 2002 Jan Kiszka ; [Version] Signature=\"$Windows NT$\" Provider=%JK% Class=Ports ClassGUID={4d36e978-e325-11ce-bfc1-08002be10318} ;DriverVer=03/26/2002,1.2.1.0 [DestinationDirs] IrCOMM2k.Copy2Drivers = 12 IrCOMM2k.Copy2Winnt = 10 IrCOMM2k.Copy2System32 = 11 IrCOMM2k.Copy2Help = 18 ; ; Driver information ; [Manufacturer] %JK% = JK.Mfg [JK.Mfg] %JK.DeviceDescIrCOMM% = IrCOMM2k_inst,IrCOMM2k ; ; General installation section ; [IrCOMM2k_inst] CopyFiles = IrCOMM2k.Copy2Drivers ;,IrCOMM2k.Copy2System32,IrCOMM2k.Copy2Help,IrCOMM2k.Copy2Winnt ;AddReg = IrCOMM2k_inst_AddReg ; ; File sections ; [IrCOMM2k.Copy2Drivers] ircomm2k.sys,,,2 ;[IrCOMM2k.Copy2System32] ;ircomm2k.exe,,,2 ;ircomm2k.dll,,,2 ;[IrCOMM2k.Copy2Help] ;ircomm2k.hlp,,,2 ;[IrCOMM2k.Copy2Winnt] ;IrCOMM2k-Setup.exe,Setup.exe,,2 ; ; Service Installation ; [IrCOMM2k_inst.Services] AddService = IrCOMM2k,0x00000002,IrCOMM2k_DriverService_Inst,IrCOMM2k_DriverEventLog_Inst ;AddService = IrCOMM2kSvc,,IrCOMM2k_Service_Inst [IrCOMM2k_DriverService_Inst] DisplayName = %IrCOMM2k.DrvName% ServiceType = 1 ; SERVICE_KERNEL_DRIVER StartType = 3 ; SERVICE_DEMAND_START ErrorControl = 0 ; SERVICE_ERROR_IGNORE ServiceBinary = %12%\\ircomm2k.sys ;[IrCOMM2k_Service_Inst] ;DisplayName = %IrCOMM2k.SvcName% ;Description = %IrCOMM2k.SvcDesc% ;ServiceType = 0x00000120 ; SERVICE_WIN32_SHARE_PROCESS, SERVICE_INTERACTIVE_PROCESS ;StartType = 2 ; SERVICE_AUTO_START ;ErrorControl = 0 ; SERVICE_ERROR_IGNORE ;ServiceBinary = %11%\\ircomm2k.exe ;Dependencies = IrCOMM2k ;AddReg = IrCOMM2kSvcAddReg [IrCOMM2k_inst.nt.HW] AddReg=IrCOMM2kHwAddReg [IrCOMM2kHwAddReg] HKR,,PortSubClass,REG_BINARY,0x00000001 ;HKR,,TimeoutScaling,REG_DWORD,0x00000001 ;HKR,,StatusLines,REG_DWORD,0x00000000 ;[IrCOMM2k_inst_AddReg] ;HKR,,EnumPropPages32,,\"ircomm2k.dll,IrCOMM2kPropPageProvider\" ;HKLM,%UNINSTALL_KEY%,DisplayIcon,0x00020000,\"%windir%\\IrCOMM2k-Setup.exe\" ;HKLM,%UNINSTALL_KEY%,DisplayName,,\"IrCOMM2k 1.2.1 \" ;HKLM,%UNINSTALL_KEY%,DisplayVersion,,\"1.2.1\" ;HKLM,%UNINSTALL_KEY%,HelpLink,,\"http://www.ircomm2k.de\" ;HKLM,%UNINSTALL_KEY%,Publisher,,%JK% ;HKLM,%UNINSTALL_KEY%,UninstallString,0x00020000,\"%windir%\\IrCOMM2k-Setup.exe\" ;[IrCOMM2kSvcAddReg] ;HKR,Parameters,ActiveConnectOnly,REG_DWORD,0x00000000 [IrCOMM2k_DriverEventLog_Inst] AddReg = IrCOMM2k_DriverEventLog_AddReg [IrCOMM2k_DriverEventLog_AddReg] HKR,,EventMessageFile,REG_EXPAND_SZ,\"%SystemRoot%\\System32\\IoLogMsg.dll;%SystemRoot%\\System32\\drivers\\ircomm2k.sys\" HKR,,TypesSupported,REG_DWORD,7 [Strings] ; ; Non-Localizable Strings ; REG_SZ = 0x00000000 REG_MULTI_SZ = 0x00010000 REG_EXPAND_SZ = 0x00020000 REG_BINARY = 0x00000001 REG_DWORD = 0x00010001 SERVICEROOT = \"System\\CurrentControlSet\\Services\" UNINSTALL_KEY = \"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\IrCOMM2k\" ; ; Localizable Strings ; JK = \"Jan Kiszka\" JK.DeviceDescIrCOMM = \"Virtueller Infrarot-Kommunikationsanschluss\" IrCOMM2k.DrvName = \"Virtueller Infrarot-Kommunikationsanschluss\" ;IrCOMM2k.SvcName = \"Virtueller Infrarot-Kommunikationsanschlu? Dienstprogramm\" ;IrCOMM2k.SvcDesc = \"Bildet |
|