quarter
驱动牛犊
驱动牛犊
  • 注册日期2002-01-29
  • 最后登录2005-02-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2278回复:5

有关于虚拟串口的问题,了解的请回贴

楼主#
更多 发布于:2002-03-06 12:01
    这段时间在写虚拟串口的驱动程序,可是我试了好多次都无法在设备管理器里添加一个串口,是否要注册串口?还是有别的方法?我看了ddk,可是看不明白这一部分。有知道的请帮忙回贴啊,谢了谢了。

最新喜欢:

idbeeidbee
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-03-06 12:41
在INF文件中指定Class = SerailPort,在驱动程序中使用IoCreateDevice带FILE_DEVICE_SERIAL_PORT参数。
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
quarter
驱动牛犊
驱动牛犊
  • 注册日期2002-01-29
  • 最后登录2005-02-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-03-07 13:40
多谢回答。
我还有一事不明(很简单的):在inf文件的model字段中,要给出设备的id,《win2000设备驱动程序设计指南》(jerry lozano)的第十六章中说“将inf文件中的一项与新安装的设备返回的设备id匹配是一件很简单的事情”。可是这件“很简单的事情”我还是做不到(有点苯^_^),我在ddk里也没有找到这个方面的说明。
我想知道对虚拟串口(win2k下)来说,这个设备id如何得到?在IoCreateDevice例程建立设备对象得到?还有这个虚拟串口是哪个总线的设备?如果这些问题无法解决,我就无法通过inf文件装上这个虚拟串口。
如果有人愿意回答,我一定给分!!!
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-03-07 18:17
上次回答有误,Class应该是Ports,至于ID号,请参阅C:\\windows\\inf\\MsPorts.inf文件,里面有标准ID,还有很多厂商ID。如果你是虚拟串口,应该可以任意写一ID试试。
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
lq1107
驱动牛犊
驱动牛犊
  • 注册日期2003-03-01
  • 最后登录2003-12-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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;
}
lq1107
驱动牛犊
驱动牛犊
  • 注册日期2003-03-01
  • 最后登录2003-12-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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
游客

返回顶部