我无法写入窗口 7 64 位平台上并行端口的控制寄存器,为什么?



我正在使用inpout32.dll来处理PC上的并行端口。我发现我可以在Windows 7 32位上更改控制寄存器的值(0x37a),但我不能使用64位。

有人知道原因吗?

dll的主页是http://www.highrez.co.uk/

我粘贴了Inpoutx64.sys的源代码,非常简单,只需调用write_port_uchar system api,64位版本和此功能的32位版本有什么区别吗?

NTSTATUS hwinterfaceDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp)
{
PIO_STACK_LOCATION  stkloc;
NTSTATUS            ntStatus = STATUS_SUCCESS; 
struct              tagPhys32Struct Phys32Struct;
PUCHAR              cData;
PUSHORT             sData;
PULONG              lData;
PUSHORT             address;
ULONG               inBuffersize;   
ULONG               outBuffersize;  
ULONG               inBuf;         
PVOID               CtrlBuff;
stkloc = IoGetCurrentIrpStackLocation( pIrp );
inBuffersize = stkloc->Parameters.DeviceIoControl.InputBufferLength;
outBuffersize = stkloc->Parameters.DeviceIoControl.OutputBufferLength;
CtrlBuff    = pIrp->AssociatedIrp.SystemBuffer;
cData  = (PUCHAR) CtrlBuff;
sData  = (PUSHORT) CtrlBuff;
lData  = (PULONG) CtrlBuff;
address = (PUSHORT) CtrlBuff;
switch ( stkloc->Parameters.DeviceIoControl.IoControlCode )
 {
    case IOCTL_READ_PORT_UCHAR:
        if ((inBuffersize >= 2) && (outBuffersize >= 1)) 
        {
            UCHAR value;
            value = READ_PORT_UCHAR((PUCHAR)address[0]);
            cData[0] = value;
        } 
        else 
        {   
            ntStatus = STATUS_BUFFER_TOO_SMALL;
        }
        pIrp->IoStatus.Information = sizeof(UCHAR); 
        ntStatus = STATUS_SUCCESS;
        break;
    case IOCTL_WRITE_PORT_UCHAR:
        if (inBuffersize >= 3) 
        {
            WRITE_PORT_UCHAR((PUCHAR)address[0], cData[2]); //Byte 0,1=Address Byte 2=Value
            pIrp->IoStatus.Information = 10;
        } 
        else 
        {
            ntStatus = STATUS_BUFFER_TOO_SMALL;
            pIrp->IoStatus.Information = 0; 
            ntStatus = STATUS_SUCCESS;
        }
        break;

我认为您对硬件体系结构有一些了解,嗯,64位架构完全更改,并且可以在硬件级别或软件级别上保护更改寄存器值。

尝试分享您想做的事情,您的问不要离开您的主要交易。

最新更新