HI,
Could you please answer on following question.
Environment Win7 x86
WDK version: 7600.16385.1
I write driver on kernel mode.User-mode application uses ioctl call to request data from driver.
I called ioctl periodically with 3 second interval from user application.
I used KdPrint with date and time stamps in my driver.
Here is my ioctl implementation:
NTSTATUS
IoctlDeviceControl(
PDEVICE_OBJECT DeviceObject,
PIRP Irp
)
{
PIO_STACK_LOCATION irpSp;
NTSTATUS ntStatus = STATUS_SUCCESS;
ULONG inBufLength;
ULONG outBufLength;
PCHAR inBuf;
PCHAR outBuf;
PACKET_INFO* packet;
LIST_ENTRY* listEntry;
KLOCK_QUEUE_HANDLE packetInfoListLockHandle;
int maxSize;
int currentSize;
int packetSize;
int count;
char data[1028];
int counter;
memset(data, 0, sizeof(data));
UNREFERENCED_PARAMETER(DeviceObject);
PAGED_CODE();
irpSp = IoGetCurrentIrpStackLocation( Irp );
inBufLength = irpSp->Parameters.DeviceIoControl.InputBufferLength;
outBufLength = irpSp->Parameters.DeviceIoControl.OutputBufferLength;
KdPrint((“Enter IoctlDeviceControl %s %s \n”, DATE, TIME));
if (!inBufLength || !outBufLength)
{
ntStatus = STATUS_INVALID_PARAMETER;
goto End;
}
if( irpSp->Parameters.DeviceIoControl.IoControlCode==IOCTL_METHOD_BUFFERED )
{
maxSize=1028;
currentSize=4;
packetSize=sizeof(PACKET_INFO);
counter=0;
while (!IsListEmpty(&gPacketInfoList))
{
if (currentSize>maxSize)
break;
packet = NULL;
KeAcquireInStackQueuedSpinLock(
&gPacketInfoListLock,
&packetInfoListLockHandle);
if (!IsListEmpty(&gPacketInfoList))
{
listEntry = RemoveHeadList(&gPacketInfoList);
packet = CONTAINING_RECORD(
listEntry,
PACKET_INFO,
listEntry);
}
KeReleaseInStackQueuedSpinLock(&packetInfoListLockHandle);
if (packet!=NULL)
{
counter++;
KdPrint((“Packet Info %d proccessed \n”,counter));
memcpy(&data[currentSize],(char*)packet,packetSize);
currentSize+=packetSize;
ExFreePoolWithTag(packet, PACKET_INFO_POOL_TAG);
}
}
count=(int)((currentSize-4)/packetSize);
KdPrint((“Count packets %d \n”,count ));
inBuf = Irp->AssociatedIrp.SystemBuffer;
outBuf = Irp->AssociatedIrp.SystemBuffer;
memcpy(&data[0],&count,4);
RtlCopyBytes(outBuf, data, currentSize);
Irp->IoStatus.Information = (outBufLength }
End:
Irp->IoStatus.Status = ntStatus;
IoCompleteRequest( Irp, IO_NO_INCREMENT );
KdPrint((“Exit IoctlDeviceControl %s %s \n”, DATE , TIME ));
return ntStatus;
}
When i looked at windbg output after few calls ioctl i saw that output sequence is incorrect by time and order.
After last call ioctl i get “access violation” error.
Here is windbg output:
Enter DriverEntry Jan 29 2011 19:37:01
Exit DriverEntry Jan 29 2011 19:37:01
Enter IoctlDeviceControl Jan 29 2011 19:37:01
Packet Info 1 proccessed
Packet Info 2 proccessed
Packet Info 3 proccessed
Packet Info 4 proccessed
Count packets 4
Exit IoctlDeviceControl Jan 29 2011 19:37:01
…
Enter IoctlDeviceControl Jan 29 2011 19:37:01
Packet Info 1 proccessed
Packet Info 2 proccessed
Packet Info 3 proccessed
Packet Info 4 proccessed
Packet Info 5 proccessed
Packet Info 6 proccessed
Count packets 6
Exit IoctlDeviceControl Jan 29 2011 19:37:01
Enter IoctlDeviceControl Jan 29 2011 19:37:01
Packet Info 1 proccessed
Packet Info 2 proccessed
Packet Info 3 proccessed
Packet Info 4 proccessed
Packet Info 5 proccessed
Packet Info 6 proccessed
Packet Info 7 proccessed
Packet Info 8 proccessed
Packet Info 9 proccessed
Packet Info 10 proccessed
Packet Info 11 proccessed
Packet Info 12 proccessed
Packet Info 13 proccessed
Packet Info 14 proccessed
Packet Info 15 proccessed
Packet Info 16 proccessed
Packet Info 1 proccessed
Packet Info 2 proccessed
Packet Info 3 proccessed
Packet Info 4 proccessed
Packet Info 5 proccessed
Packet Info 6 proccessed
Packet Info 7 proccessed
Packet Info 8 proccessed
Packet Info 9 proccessed
Packet Info 10 proccessed
Packet Info 11 proccessed
Count packets 11
Access violation - code c0000005 (!!! second chance !!!)
TestDriver!IoctlDeviceControl+0x287:
92131c37 8b480c mov ecx,dword ptr [eax+0Ch]
How to resolve this issue?
Thanks for any help.