关于_outp

couch1974 2004-03-15 05:23:03
请问在win2000下象_outp这样的函数调用是不是不兼容啊
...全文
333 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
swbreath 2004-04-25
  • 打赏
  • 举报
回复
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写端口即可.

狂放之歌 2004-04-24
  • 打赏
  • 举报
回复
以前有老大贴过代码..搜一搜..
simouse 2004-04-23
  • 打赏
  • 举报
回复
关注ing...
seaquester 2004-04-23
  • 打赏
  • 举报
回复
Win2000下应用程序不能直接用I/O函数读写端口,搜一下WinIO吧,调用它的接口就可以了。
nuaawenlin 2004-04-23
  • 打赏
  • 举报
回复
在csdn上搜一下

我记得有一个驱动是可以的
lgchina97 2004-04-19
  • 打赏
  • 举报
回复
_outp and _inp是直接和端口打交道的程序,它可在win9x下运行

但win2000是保护模式的,用户不能对硬件直接读写,需写驱动程序才可以访问硬件。
住院部分 HIS数据流 2008 一、住院登记模块 1.住院预约 insert表WAIT_BED_PATS 2.住院登记“保存"操作 insert表 pat_master_index(病人主索引,新来院病人是insert,再次来院病人是update)、 pat_visit(病人住院主记录)、 pats_in_hospital(在院病人记录表) 、 diagnosis(诊断记录表) 、 pats_in_transferring(转科记录表) delete表 wait_bed_pats(等床病人表,针对已经预约的病人 ) update表 auto_setting_id(自动生成病人id的情况) 3.改名 update表pat_master_index、exam_appoints、exam_master、exam_pat_mi、doct_drug_presc_master、drug_presc_master、drug_presc_master_temp、lab_test_master、ARREAR_REC insert表Pat_master_rename_log 4.改号 update表PAT_MASTER_INDEX、ADT_LOG、DIAGNOSIS、DIAGNOSTIC_CATEGORY、DIAG_COMPARING、DOCTOR_ORDERS、EXAM_APPOINTS、EXAM_MASTER、EXAM_PAT_MI、INP_BILL_CHECKED、INP_BILL_DETAIL、INP_MR_REC、INP_MR_TRACE、INP_SETTLE_MASTER、MEDICAL_COSTS、MR_FILE_INDEX、NEED_BILLING_PATS、OPERATION、OPERATION_SCHEDULE、ORDERS、ORDERS_COSTS、ORDERS_SHEET_IMAGE、OUTP_MR_REC、OUTP_MR_TRACE、PATS_IN_HOSPITAL、PATS_IN_TRANSFERRING、PAT_VISIT、PMI_MERGED_LOG、PREPAYMENT_RCPT、PRE_DISCHGED_PATS、SCHEDULED_OPERATION_NAME、TRANSFER、UNSETTLE_REC、VITAL_SIGNS_REC、WAIT_BED_PATS、blood_apply insert表pmi_merged_log 5.并号 insert表pmi_merged_log delete表OUTP_MR_REC 、OUTP_MR_TRACE、INP_MR_REC、PAT_MASTER_INDEX update表WAIT_BED_PATS、PATS_IN_TRANSFERRING、PRE_DISCHGED_PATS、EXAM_PAT_MI、EXAM_APPOINTS、EXAM_MASTER 二、医生站护士站模块 1、护士站入科”保存“操作 insert表 transfer(在科病人记录)当病人入科、转科操作时会新增记录 adt_log(出入转日志)记录当前病人入出转科及病人病情变化日志 orders_group_rec(主管医生记录)记录此病人的主管医生 update表 pats_in_hospital(在院病人记录)更新此表中的入科日期、床位、科室等信息 bed_rec(床位记录表)更新病人的入住此床位状态 pat_visit(病人住院 主记录)更新病人入科科室和诊断等信息 delete表 pats_in_transferring(转科记录表) 2、医生站”新建“病历操作 insert表 mr_on_line(联机病历表) mr_index(病案索引表) update表

2,641

社区成员

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

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