Я не могу записать в регистр управления для параллельного порта на 64-битной платформе Windows 7, почему? - PullRequest
0 голосов
/ 02 марта 2019

Я использую inpout32.dll для работы с параллельным портом на моем компьютере.Я считаю, что могу изменить значение контрольного регистра (0x37a) на Windows 7 32-битной, но я не могу на 64-битной.

Кто-нибудь знает причину?

Домашняя страница библиотеки DLL http://www.highrez.co.uk/

Я вставляю исходный код для inpoutx64.sys следующим образом, это довольно просто, простовызвать системный API WRITE_PORT_UCHAR, есть ли различия для 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;

1 Ответ

0 голосов
/ 02 марта 2019

Я думаю, что у вас есть кое-какие знания об аппаратной архитектуре, ну, 64-битная архитектура полностью меняется, и значения регистров изменений можно защитить для аппаратного или программного уровня.

попытайтесь поделиться тем, что вы хотите сделать,Ваш вопрос не оставил ясным, с чем вы имеете дело.

...