• 大小: 965KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2023-05-15
  • 语言: 其他
  • 标签:

资源简介

主要功能 =========== 基本上跟商业软件Virtual Serial Ports Driver XP3类似。 1.在操作系统中,虚拟出若干串口。可以使用串口工具(比如操作系统自带的超级终端软件)对串口进行打开、发送、接收、关闭等操作。 2. 由于是虚拟串口,所以可以设置任意波特率、数据位、奇偶校验、停止位等端口操作。 3. 通过协议传送、接收数据。 使用说明 =========== 1. 安装toaster( win2k ddk sample)总线驱动程序:BusEnum.sys。安装步骤详见DDK的toaster\bus例子 2. 控制台上运行enum -p 1,对新的硬件设备指定 SimSerial\inf目录,安装我们的虚拟串口驱动程序。 安装完毕以后在“设备管理器”中应该多出一类设备“VirtualSerial”。enum程序由DDK的toaster\exe\enum例子编译。只是改动了toaster\inc\public.h中的#define BUS_HARDWARE_IDS L"Toaster\\MsToaster\0" 3. 控制台上运行enum -p 2,添加第二个虚拟串口设备 4. 控制台上运行test.exe,枚举并且互连刚刚生成的两个串口。 5. 打开“超级终端”,在“连接到”对话框上“连接时使用”中选择“COM20” 6. 打开“超级终端”,在“连接到”对话框上“连接时使用”中选择“COM21” 7. 卸载设备可以在控制台上运行 enum -u 1, enum -u 2 8. 更新驱动程序时,只需要将所有的虚拟串口卸载,然后再编译驱动程序,build -ceZ,运行cc.bat即可。

资源截图

代码片段和文件信息

// Test.cpp : Defines the entry point for the console application.
//

#include “stdafx.h“
#include 
#include 
//#include 

#include 

#include 
#include “objbase.h“
#include 
#include “..\inc\wdmioctl.h“

DEFINE_GUID(GUID_CLASS_COMPORT          0x86e0d1e0L 0x8089 0x11d0 0x9c 0xe4 0x08 0x00 0x3e 0x30 0x1f 0x73);

void HandleDevice( PSP_INTERFACE_DEVICE_DETAIL_DATA detail );

int main(int argc char* argv[])
{
HDEVINFO info;
DWORD n;
BOOL bRet;
DWORD needed;
SP_INTERFACE_DEVICE_DATA ifdata;
PSP_INTERFACE_DEVICE_DETAIL_DATA detail = NULL;

// 首先得到该ClassGUID值下的设备信息句柄 info. 本程序中ClassGUID代表串口设备类
// HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses\{86e0d1e0-8089-11d0-9ce4-08003e301f73}
info = SetupDiGetClassDevs( (LPGUID) &GUID_CLASS_COMPORT//(LPGUID)&GUID_WDMSAMPLE_DEVICE_INTERFACE_CLASS
NULL NULL DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
if( info == INVALID_HANDLE_VALUE ){
printf(“Error %d trying to open enumeration handle for \n“ GetLastError() );
return 0;
}

    ifdata.cbSize = sizeof(ifdata);
n = 0;
// 使用该 info 依次枚举当前该ClassGUID下的所有设备接口,将该接口信息放在ifdata
    while( SetupDiEnumDeviceInterfaces(info NULL (LPGUID)&GUID_CLASS_COMPORT//(LPGUID) &GUID_WDMSAMPLE_DEVICE_INTERFACE_CLASS
n &ifdata))
{
// 第一次调用 SetupDiGetDeviceInterfaceDetail,得到ifdata所需空间大小
SetupDiGetDeviceInterfaceDetail(info &ifdata NULL 0 &needed NULL);
detail = (PSP_INTERFACE_DEVICE_DETAIL_DATA) malloc(needed);
if (!detail)
{
printf(“Error %d trying to get memory for interface detail\n“ GetLastError());
goto FAILED;
}
// 第二次调用 SetupDiGetDeviceInterfaceDetail,得到ifdata指代的设备的详细信息
detail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
if (!SetupDiGetDeviceInterfaceDetail(info &ifdata detail needed NULL NULL))
{
printf(“Error %d getting interface detail\n“ GetLastError());
goto FAILED;
}

// 对ifdata/detail所指代的设备进行打开,IoControl,关闭等操作
HandleDevice( detail );

free( detail );
detail = NULL;
n++;
}
FAILED:
if( detail != NULL ){
free( detail );
}
bRet = SetupDiDestroyDeviceInfoList( info );
return 0;
}
void HandleDevice( PSP_INTERFACE_DEVICE_DETAIL_DATA detail )
{
    char name[ MAX_PATH ];
HANDLE hfile;
DWORD junk;
INT ComX;

// 打开设备,此处的设备名称为Kernel mode下IoRegisterDeviceInterface后OS自动生成名称。如下形式
// ##?#Toaster#MsToaster#1&1aafb3d5&2&01#{86e0d1e0-8089-11d0-9ce4-08003e301f73}
strncpy(name detail->DevicePath sizeof(name));
hfile = CreateFile( name GENERIC_READ | GENERIC_WRITE 0 NULL OPEN_EXISTING 0 NULL);
    if (hfile == INVALID_HANDLE_VALUE)
    {
        printf(“Error %d trying to open %s\n“ GetLastError() name);
        return;
    }
scanf( “%d“ &ComX );
#if 1
if(!DeviceIoControl(hfileIOCTL_INIT_SETTING &ComX sizeof( INT ) NULL  0 &junk NULL))
    {
printf(“Direct IOCTL failed with code %d

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     目录          0  2004-01-16 09:10  SimSerial

     目录          0  2004-01-16 09:10  SimSerial\DebugLog

     目录          0  2004-01-16 09:10  SimSerial\DebugLog\24

     文件      30970  2003-12-24 23:32  SimSerial\DebugLog\24\COM9口发送文件打印信息.log

     文件      28792  2003-12-24 23:43  SimSerial\DebugLog\24\com9接收文件打印信息.log

     文件      12368  2003-12-17 23:44  SimSerial\DebugLog\filter打印信息_8.27.log

     文件       2190  2003-12-11 22:30  SimSerial\DebugLog\GetResource.log

     文件       7892  2003-12-11 23:00  SimSerial\DebugLog\toaster_bus分析2003_12_11.log

     文件       4928  2003-12-17 23:27  SimSerial\DebugLog\使用超级终端打开虚拟串口.log

     文件      36374  2003-12-18 22:55  SimSerial\DebugLog\接收文件.log

     文件        350  2004-01-07 23:56  SimSerial\DebugLog\设备名的处理说明.txt

     文件      16322  2003-12-18 21:18  SimSerial\DebugLog\超级终端中接收文件.log

     文件       9692  2003-12-24 21:36  SimSerial\DebugLog\过滤驱动拦截XP3虚拟串口信息.log

     目录          0  2004-01-16 09:10  SimSerial\exe

     文件       3389  2003-12-26 23:48  SimSerial\exe\1.c

     文件       1196  2003-07-16 21:44  SimSerial\exe\ReadMe.txt

     文件        291  2003-07-16 21:44  SimSerial\exe\StdAfx.cpp

     文件        769  2003-07-16 21:44  SimSerial\exe\StdAfx.h

     文件       9795  2004-01-14 23:45  SimSerial\exe\Test.cpp

     文件       4551  2004-01-08 22:31  SimSerial\exe\Test.dsp

     文件        531  2003-07-16 21:44  SimSerial\exe\Test.dsw

     文件      58368  2004-01-14 23:46  SimSerial\exe\Test.ncb

     文件      55808  2004-01-14 23:46  SimSerial\exe\Test.opt

     文件       1451  2004-01-14 23:46  SimSerial\exe\Test.plg

     文件        657  2004-01-15 23:53  SimSerial\exe\说明.txt

     目录          0  2004-01-16 09:10  SimSerial\filter

     目录          0  2003-12-17 23:30  SimSerial\filter\buslower

     文件        271  2000-07-27 01:35  SimSerial\filter\buslower\MAKEFILE

     文件         91  2000-07-27 01:35  SimSerial\filter\buslower\sources

     目录          0  2003-12-17 23:30  SimSerial\filter\busupper

............此处省略178个文件信息

评论

共有 条评论

相关资源