描述:
我写了一驱动程序,应用程序调用DeviceIoControl函数接受数据却只能得到4个字节(我是想得到5个字节).请各位指点,谢谢!
应用程序代码:
......
typedef struct OutParaStruct{
UCHAR Flag;
UCHAR PciConfig[64];
}OutParaStruct,*POutParaStruct;
OutParaStruct RetInforma;
RetInforma.Flag=0;
for(int i=0;i<65;i++)
RetInforma.PciConfig[i]=0;
DWORD OutBuffer;
DWORD Returned;
HANDLE hDevice;
hDevice = CreateFile( "\\\\.\\MyDevice",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
bool ret;
long ConfigPara;
for(long BusNumber=0;BusNumber<4;BusNumber++)
for(long DevNumber=0;DevNumber<32;DevNumber++)
for(long FuncNumber=0;FuncNumber<8;FuncNumber++)
{
C|(BusNumber<<16)|(DevNumber<<11)|(FuncNumber<<8)|(0x0<<2);
bool ret=DeviceIoControl(hDevice,IOCTL_GET_VALUE,(LPVOID)&ConfigPara,(DWORD)65,(LPVOID)&RetInforma,(DWORD)65,&Returned,NULL);
if((int)(BYTE)RetInforma.Flag==true)
{
}
}
驱动程序代码:
UCHAR OutParaBuffer[65];
NTSTATUS TestWDMIoControl(IN PDEVICE_OBJECT fdo,IN PIRP irp)
{
PIO_STACK_LOCATION IrpStack=IoGetCurrentIrpStackLocation(irp);
ULONG C />
for(int i=0;i<65;i++)
OutParaBuffer[i]=0x0;
PVOID inputBuffer, outputBuffer;
ULONG inputBufferLength, outputBufferLength;
ULONG ioControlCode;
//get Buffer's Positon & length.
inputBuffer = irp->AssociatedIrp.SystemBuffer;
inputBufferLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
outputBuffer = irp->AssociatedIrp.SystemBuffer;
outputBufferLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
ULONG ConfigData;
ULONG VenDevID;
USHORT VendorID,DeviceID;
ULONG ConfigAddrPortAddress;
ULONG ConfigDataPortAddress;
switch(ControlCode)
{
case IOCTL_GET_VALUE:
__asm{
pusha
mov eax,[ebp+0xc]
mov ebx,[eax+0xc]
mov eax,[ebx]
mov ConfigData,eax
mov eax,ConfigData
mov dx,0xcf8
out dx,eax
mov dx,0xcfc
in eax,dx
cmp ax,0xffff
jz lable1
mov VenDevID,eax
mov VendorID,ax
shr eax,16
mov DeviceID,ax
lable1: popa
}
if((VendorID)!=0xffff)
{
OutParaBuffer[0]=0x1;
OutParaBuffer[1]=(UCHAR)VenDevID;
OutParaBuffer[2]=(UCHAR)(VenDevID>>8);
OutParaBuffer[3]=(UCHAR)(VenDevID>>16);
OutParaBuffer[4]=(UCHAR)(VenDevID>>24);
__asm{
pusha
popa
}
RtlCopyMemory(irp->AssociatedIrp.SystemBuffer,OutParaBuffer,outputBufferLength);
}
break;
default:
break;