高分相送,关于WIN2000底下串口和并口的问题!

pchia 2004-04-03 07:14:59
现在,很多软件可在98底下对串口和并口进行操作,但是同样的软件在WIN2000下就没法用,听说好象98软件是直接对串口,并口地址进行操作,WIN2000屏蔽了用户的直接操作,我记得有个软件可以使其兼容,即将以前98的软件里对串口,并口直接操作变成在WIN2000下的正常操作,说白了也就是使原98下能用串口的软件在2000下也能正常使用,有人知道这个软件么?能提供相应信息的高分相送!!!!!!!!!!!
...全文
148 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lixiaosan 2004-05-11
  • 打赏
  • 举报
回复
去下载一个winio用吧。。顶好
ppcust 2004-05-10
  • 打赏
  • 举报
回复
可以先下个api函数库 port95nt

就可以直接操作了
pchia 2004-04-09
  • 打赏
  • 举报
回复
高手不少,呵呵。该怎么给分呢?^_^
l_xiangxi 2004-04-08
  • 打赏
  • 举报
回复
我在用Yariv Kaplan 写 WinIo 2.0(免费第三方dll)

的WINIO对端口直接访问时发现运行读硬盘参数程序很正常,

可是我要访问COM1(0X3F8)或COM2(0X2F8)

总是读出的值为FF,而且写不进去。

int port=0x3f8;

//初始化COM
OutPort (port+0x03,0xab);// 3FB 停止1,字的长度8 ,用奇偶校验1,
OutPort (port,0x30); //3F8
OutPort (port+0x01,0); //3f9,0 波特率2.4K

InPort(port)的结果为:FF

程序未报任何错误,不知道是什么原因
sohou 2004-04-08
  • 打赏
  • 举报
回复
用DDK写一个小型的驱动就可以了,也就是改变系统的具有0级权限的表,让你的程序具有0级权限,.sys的驱动在系统启动的时候就做这个事情!这个也不是一两句话可以说的清楚的!
bluebohe 2004-04-08
  • 打赏
  • 举报
回复
串口并口的程序一般都是能用的,只要不是你通过直接读写端口的方式
否则的话这篇文章对你有用
NT下对I/O操作进行了保护的,不允许直接访问i/o端口,一般的解决方法是
编写驱动程序,这样可以在Kernel层访问I/O.在NT/2000DDK\src\general目录下有个
portio的例子,拿来就可以用了.还有更好的方法,利用DDK中几个未公开的API也可以
达到同样的目的.
//portio.c
#include
/*
* The name of our device driver.
*/
#define DEVICE_NAME_STRING L"portio"
#define IOPM_SIZE 0x2000
typedef UCHAR IOPM[IOPM_SIZE];
IOPM *IOPM_local = 0;

void Ke386SetIoAccessMap(int, IOPM *);
void Ke386QueryIoAccessMap(int, IOPM *);
void Ke386IoSetAccessProcess(PEPROCESS, int);

/*********************************************************************
Release any allocated objects.
*********************************************************************/
VOID GiveioUnload(IN PDRIVER_OBJECT DriverObject)
{
WCHAR DOSNameBuffer[] = L"\\DosDevices\\" DEVICE_NAME_STRING;
UNICODE_STRING uniDOSString;

if(IOPM_local)
MmFreeNonCachedMemory(IOPM_local, sizeof(IOPM));

RtlInitUnicodeString(&uniDOSString, DOSNameBuffer);
IoDeleteSymbolicLink (&uniDOSString);
IoDeleteDevice(DriverObject->DeviceObject);
}

VOID SetIOPermissionMap(int OnFlag)
{
Ke386IoSetAccessProcess(PsGetCurrentProcess(), OnFlag);
Ke386SetIoAccessMap(1, IOPM_local);
}

void GiveIO(void)
{
SetIOPermissionMap(1);
}

NTSTATUS GiveioCreateDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{
GiveIO(); // give the calling process I/O access

Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}

NTSTATUS DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
{
PDEVICE_OBJECT deviceObject;
NTSTATUS status;
WCHAR NameBuffer[] = L"\\Device\\" DEVICE_NAME_STRING;
WCHAR DOSNameBuffer[] = L"\\DosDevices\\" DEVICE_NAME_STRING;
UNICODE_STRING uniNameString, uniDOSString;

//
// Allocate a buffer for the local IOPM and zero it.
//
IOPM_local = MmAllocateNonCachedMemory(sizeof(IOPM));
if(IOPM_local == 0)
return STATUS_INSUFFICIENT_RESOURCES;
RtlZeroMemory(IOPM_local, sizeof(IOPM));

//
// Set up device driver name and device object.
//
RtlInitUnicodeString(&uniNameString, NameBuffer);
RtlInitUnicodeString(&uniDOSString, DOSNameBuffer);

status = IoCreateDevice(DriverObject, 0,
&uniNameString,
FILE_DEVICE_UNKNOWN,
0, FALSE, &deviceObject);

if(!NT_SUCCESS(status))
return status;

status = IoCreateSymbolicLink (&uniDOSString, &uniNameString);

if (!NT_SUCCESS(status))
return status;

//
// Initialize the Driver Object with driver's entry points.
// All we require are the Create and Unload operations.
//
DriverObject->MajorFunction[IRP_MJ_CREATE] = GiveioCreateDispatch;
DriverObject->DriverUnload = GiveioUnload;
return STATUS_SUCCESS;
}

//在同一个目录下建造sources文件,内容:
TARGETNAME=portio
TARGETPATH=.
TARGETTYPE=DRIVER
INCLUDES=e:\ntddk\inc ;//这儿填写DDK下inc目录的路径
SOURCES=portio.c

//在同一个目录下建造makefile文件,内容:
!INCLUDE $(NTMAKEENV)\makefile.def

利用命令行:SetEnv e:\ntddk //设置DDK环境
在该目录下 build,然后会在该目录的I386中产生portio.sys文件,将文件
copy到WINNT\system32\drivers里面,在注册表中手工安装驱动程序(别告诉我你不会
,到驱动程序版查查,最好设置为驱动程序自动启动,service的key为portio),重起机子。

编写用户态程序:
HANDLE h;
h = CreateFile("\\\\.\\portio", GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NUULL);
if(h == INVALID_HANDLE_VALUE) {
printf("Couldn't access giveio device\n");
return -1;
}
CloseHandle(h);
//然后以后用嵌入汇编或者_inp,_oup写端口即可.

itmaster 2004-04-05
  • 打赏
  • 举报
回复
http://software.czinfo.net/sort2.php?sort2=0906&sor=00
zhangnanonnet 2004-04-05
  • 打赏
  • 举报
回复
你说得软件好像没有,你还是自己作一个把
zhangnanonnet 2004-04-05
  • 打赏
  • 举报
回复
你用API不就可以了,CREATEFILE,READFILE,WRITEFILE什么的,98/NT/2000都可以
给你个例子
extern "C" bool PASCAL Link() //连接到打印机
{
m_hCardInterFace =
CreateFile("LPT1", // 这个是并口的,串口的改成"COM1"之类的就可以了
GENERIC_WRITE,
NULL,NULL,
OPEN_EXISTING,
NULL,
NULL);
if(m_hCardInterFace!=INVALID_HANDLE_VALUE)
{
m_CommTimeouts.ReadIntervalTimeout = 1000;//读操作两个字节之间的时间(单位:毫秒)
m_CommTimeouts.ReadTotalTimeoutMultiplier = 1000;//读操作的时间(单位:毫秒)
m_CommTimeouts.ReadTotalTimeoutConstant = 1000;
m_CommTimeouts.WriteTotalTimeoutMultiplier = 1000;
m_CommTimeouts.WriteTotalTimeoutConstant = 1000;
SetCommTimeouts(m_hCardInterFace, &m_CommTimeouts);
return true;
}
return false;
}
extern "C" void PASCAL Unlink() //断开打印机
{
CloseHandle(m_hCardInterFace);
}
bool SendCommand(CString CommandWord) //向打印机发出命令,并且返回命令状态
{
DWORD t1,dwRead;
COMSTAT t2;

CString Command=0x1b;
Command+=CommandWord;
Command+=0x0d;
WriteFile(
m_hCardInterFace,
Command.GetBuffer (Command.GetLength ()),
Command.GetLength (),
&dwRead,
NULL);
if(!ClearCommError(m_hCardInterFace,&t1,&t2))
{
switch(t1)
{
case CE_OOP:
TRACE("G CE_OOP\n");
return false;
break;
case CE_PTO://超时错误
TRACE("G CE_PTO\n");
return false;
break;
case CE_IOE:
TRACE("G CE_IOE\n");
return false;
break;
}
}


return true;
}
pchia 2004-04-05
  • 打赏
  • 举报
回复
谢谢各位了,托大家的帮忙,我已经找到那个软件了,是DLPortIO和WinIO,前面一个好像比较好用,欢迎大家讨论这两个软件。
ymbymb 2004-04-05
  • 打赏
  • 举报
回复
要安装一个驱动程序.giveio.sys, 然后在你的程序中如下打开一下就可以了
BOOL CMyApp::InitInstance()
{
OSVERSIONINFO osVer;
osVer.dwOSVersionInfoSize = sizeof(osVer);
GetVersionEx(&osVer);
if(osVer.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS)
{

HANDLE h;

h = CreateFile("\\\\.\\giveio", GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(h == INVALID_HANDLE_VALUE) {
AfxMessageBox("Couldn't access giveio device\n");
return -1;
}
else
CloseHandle(h);
}
...
_inp(0x379);
...
}
给个邮件地址,我把这个驱动文件发给你
zhangcrony 2004-04-05
  • 打赏
  • 举报
回复
I have no idea of that...but i think it could be implement, I'm sure
gagamazel 2004-04-04
  • 打赏
  • 举报
回复
刚才去在google搜索了半天,也没找到相关的。你一点也不记得什么名字呀?
是不是添加几个dll就行了呀,好像一篇文章里这样讲的

2,644

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧