Hi Experts,
I make request in the begining of my usb driver as following:
VOID
DpcRoutine(
IN PKDPC Dpc,
IN PVOID DeferredContext,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2
)
/*++
Routine Description:
DPC routine triggered by the timer to check the idle state
of the device and submit an idle request for the device.
Arguments:
DeferredContext - context for the dpc routine.
DeviceObject in our case.
Return Value:
None
–*/
{
static int NumPos = 0;
NTSTATUS ntStatus;
UCHAR k;
TimeTick++;
NumPos += 1;//never again…
if(NumPos==81){
// for(k=0;k<9;k++){
InitBufferWrite[0] = 0x0a;
InitBufferWrite[1] = 0x02;
InitBufferWrite[2] = 0x45;
InitBufferWrite[3] = 0;
sendInerRegstVendorRequest(
tDeviceObject
);
pInRgstirp = IoBuildAsynchronousFsdRequest(IRP_MJ_READ,
tDeviceObject,
angleBuff,
DataTransferLength,
&largeInt,
NULL);
IoSetCompletionRoutine(pInRgstirp,
(PIO_COMPLETION_ROUTINE)readIoCompletion,
tDeviceObject,
TRUE,
TRUE,
TRUE);
if (!pInRgstirp) {
return;// STATUS_INSUFFICIENT_RESOURCES;
}
ntStatus = BulkUsb_InerRegstUrbReadWrite(tDeviceObject,
pInRgstirp,
TRUE); // false to write, true to read
}else if(NumPos==82){
InitBufferWrite[0] = 0x0a;
InitBufferWrite[1] = 0x02;
InitBufferWrite[2] = 0x45;
InitBufferWrite[3] = 1;
sendInerRegstVendorRequest(
tDeviceObject
);
pInRgstirp = IoBuildAsynchronousFsdRequest(IRP_MJ_READ,
tDeviceObject,
angleBuff,
DataTransferLength,
&largeInt,
NULL);
IoSetCompletionRoutine(pInRgstirp,
(PIO_COMPLETION_ROUTINE)readIoCompletion,
tDeviceObject,
TRUE,
TRUE,
TRUE);
if (!pInRgstirp) {
return;// STATUS_INSUFFICIENT_RESOURCES;
}
ntStatus = BulkUsb_InerRegstUrbReadWrite(tDeviceObject,
pInRgstirp,
TRUE); // false to write, true to read
}else if(NumPos==83){
InitBufferWrite[0] = 0x0a;
InitBufferWrite[1] = 0x02;
InitBufferWrite[2] = 0x45;
InitBufferWrite[3] = 2;
sendInerRegstVendorRequest(
tDeviceObject
);
pInRgstirp = IoBuildAsynchronousFsdRequest(IRP_MJ_READ,
tDeviceObject,
angleBuff,
DataTransferLength,
&largeInt,
NULL);
IoSetCompletionRoutine(pInRgstirp,
(PIO_COMPLETION_ROUTINE)readIoCompletion,
tDeviceObject,
TRUE,
TRUE,
TRUE);
if (!pInRgstirp) {
return;// STATUS_INSUFFICIENT_RESOURCES;
}
ntStatus = BulkUsb_InerRegstUrbReadWrite(tDeviceObject,
pInRgstirp,
TRUE); // false to write, true to read
// }
}else if(NumPos==84){
InitBufferWrite[0] = 0x0a;
InitBufferWrite[1] = 0x02;
InitBufferWrite[2] = 0x45;
InitBufferWrite[3] = 3;
sendInerRegstVendorRequest(
tDeviceObject
);
pInRgstirp = IoBuildAsynchronousFsdRequest(IRP_MJ_READ,
tDeviceObject,
angleBuff,
DataTransferLength,
&largeInt,
NULL);
IoSetCompletionRoutine(pInRgstirp,
(PIO_COMPLETION_ROUTINE)readIoCompletion,
tDeviceObject,
TRUE,
TRUE,
TRUE);
if (!pInRgstirp) {
return;// STATUS_INSUFFICIENT_RESOURCES;
}
ntStatus = BulkUsb_InerRegstUrbReadWrite(tDeviceObject,
pInRgstirp,
TRUE); // false to write, true to read
}else if(NumPos==85){
InitBufferWrite[0] = 0x0a;
InitBufferWrite[1] = 0x02;
InitBufferWrite[2] = 0x45;
InitBufferWrite[3] = 4;
sendInerRegstVendorRequest(
tDeviceObject
);
pInRgstirp = IoBuildAsynchronousFsdRequest(IRP_MJ_READ,
tDeviceObject,
angleBuff,
DataTransferLength,
&largeInt,
NULL);
IoSetCompletionRoutine(pInRgstirp,
(PIO_COMPLETION_ROUTINE)readIoCompletion,
tDeviceObject,
TRUE,
TRUE,
TRUE);
if (!pInRgstirp) {
return;// STATUS_INSUFFICIENT_RESOURCES;
}
ntStatus = BulkUsb_InerRegstUrbReadWrite(tDeviceObject,
pInRgstirp,
TRUE); // false to write, true to read
}else if(NumPos==86){
InitBufferWrite[0] = 0x0a;
InitBufferWrite[1] = 0x02;
InitBufferWrite[2] = 0x45;
InitBufferWrite[3] = 5;
sendInerRegstVendorRequest(
tDeviceObject
);
pInRgstirp = IoBuildAsynchronousFsdRequest(IRP_MJ_READ,
tDeviceObject,
angleBuff,
DataTransferLength,
&largeInt,
NULL);
IoSetCompletionRoutine(pInRgstirp,
(PIO_COMPLETION_ROUTINE)readIoCompletion,
tDeviceObject,
TRUE,
TRUE,
TRUE);
if (!pInRgstirp) {
return;// STATUS_INSUFFICIENT_RESOURCES;
}
ntStatus = BulkUsb_InerRegstUrbReadWrite(tDeviceObject,
pInRgstirp,
TRUE); // false to write, true to read
}else if(NumPos==87){
InitBufferWrite[0] = 0x0a;
InitBufferWrite[1] = 0x02;
InitBufferWrite[2] = 0x45;
InitBufferWrite[3] = 6;
sendInerRegstVendorRequest(
tDeviceObject
);
pInRgstirp = IoBuildAsynchronousFsdRequest(IRP_MJ_READ,
tDeviceObject,
angleBuff,
DataTransferLength,
&largeInt,
NULL);
IoSetCompletionRoutine(pInRgstirp,
(PIO_COMPLETION_ROUTINE)readIoCompletion,
tDeviceObject,
TRUE,
TRUE,
TRUE);
if (!pInRgstirp) {
return;// STATUS_INSUFFICIENT_RESOURCES;
}
ntStatus = BulkUsb_InerRegstUrbReadWrite(tDeviceObject,
pInRgstirp,
TRUE); // false to write, true to read
}else if(NumPos==88){
InitBufferWrite[0] = 0x0a;
InitBufferWrite[1] = 0x02;
InitBufferWrite[2] = 0x45;
InitBufferWrite[3] = 7;
sendInerRegstVendorRequest(
tDeviceObject
);
pInRgstirp = IoBuildAsynchronousFsdRequest(IRP_MJ_READ,
tDeviceObject,
angleBuff,
DataTransferLength,
&largeInt,
NULL);
IoSetCompletionRoutine(pInRgstirp,
(PIO_COMPLETION_ROUTINE)readIoCompletion,
tDeviceObject,
TRUE,
TRUE,
TRUE);
if (!pInRgstirp) {
return;// STATUS_INSUFFICIENT_RESOURCES;
}
ntStatus = BulkUsb_InerRegstUrbReadWrite(tDeviceObject,
pInRgstirp,
TRUE); // false to write, true to read
}else if(NumPos==89){
InitBufferWrite[0] = 0x0a;
InitBufferWrite[1] = 0x02;
InitBufferWrite[2] = 0x45;
InitBufferWrite[3] = 8;
sendInerRegstVendorRequest(
tDeviceObject
);
pInRgstirp = IoBuildAsynchronousFsdRequest(IRP_MJ_READ,
tDeviceObject,
angleBuff,
DataTransferLength,
&largeInt,
NULL);
IoSetCompletionRoutine(pInRgstirp,
(PIO_COMPLETION_ROUTINE)readIoCompletion,
tDeviceObject,
TRUE,
TRUE,
TRUE);
if (!pInRgstirp) {
return;// STATUS_INSUFFICIENT_RESOURCES;
}
ntStatus = BulkUsb_InerRegstUrbReadWrite(tDeviceObject,
pInRgstirp,
TRUE); // false to write, true to read
}else if(NumPos==90){
/* if(PinCordin[0]==0x01)
angleBuff[0] = 1;
if(PinCordin[1]==0x0c)
angleBuff[0] = 1;
if(PinCordin[2]==0x01)
angleBuff[0] = 1;
if(PinCordin[3]==0x63)
angleBuff[0] = 1;
if(PinCordin[4]==0x0f)
angleBuff[0] = 1;
if(PinCordin[5]==0x77)
angleBuff[0] = 1;
if(PinCordin[6]==0x01)
angleBuff[0] = 1;
if(PinCordin[7]==0x00)
angleBuff[0] = 1;
if(PinCordin[8]==0x0f)
angleBuff[0] = 1;
if(PinCordin[9]==0x6a)
angleBuff[0] = 1;*/
switch(Pinangle){
case ZERO:
xMinHigh =(PinCordin[0]> PinCordin[12])?PinCordin[12]:PinCordin[0];
xMinLow = (PinCordin[1] > PinCordin[13]) ? PinCordin[13]:PinCordin[1];
xMaxHigh = (PinCordin[4]>PinCordin[8]) ?PinCordin[4]:PinCordin[8];
xMaxLow = (PinCordin[5]>PinCordin[9]) ?PinCordin[5]:PinCordin[9];
yMinHigh = (PinCordin[2]>PinCordin[6]) ? PinCordin[6]:PinCordin[2];
yMinLow = (PinCordin[3] >PinCordin[7]) ? PinCordin[7]:PinCordin[3];
yMaxHigh = (PinCordin[10] >PinCordin[14]) ? PinCordin[10]:PinCordin[14];
yMaxLow = (PinCordin[11] > PinCordin[15]) ? PinCordin[11]:PinCordin[15];
break;
case NINETY:
xMaxHigh = (PinCordin[0] >PinCordin[4]) ? PinCordin[0]:PinCordin[4];
xMaxLow = (PinCordin[1] > PinCordin[5]) ? PinCordin[1]:PinCordin[5];
xMinHigh = (PinCordin[8] > PinCordin[12]) ? PinCordin[12]:PinCordin[8];
xMinLow = (PinCordin[9] > PinCordin[13]) ? PinCordin[13]:PinCordin[9];
yMaxHigh = (PinCordin[6] > PinCordin[10]) ? PinCordin[6]:PinCordin[10];
yMaxLow = (PinCordin[7] > PinCordin[11]) ? PinCordin[7]:PinCordin[11];
yMinHigh = (PinCordin[2] > PinCordin[14]) ? PinCordin[14]:PinCordin[2];
yMinLow = (PinCordin[3] > PinCordin[15]) ? PinCordin[15]:PinCordin[3];
break;
case ONEHUNDREDEIGHTY:
xMaxHigh = (PinCordin[0] > PinCordin[12]) ? PinCordin[12]:PinCordin[0];
xMaxLow = (PinCordin[1] > PinCordin[13]) ? PinCordin[13]:PinCordin[1];
xMinHigh = (PinCordin[4] > PinCordin[8]) ? PinCordin[4]:PinCordin[8];
xMinLow = (PinCordin[5] > PinCordin[9]) ? PinCordin[5]:PinCordin[9];
yMaxHigh = (PinCordin[2] > PinCordin[6]) ? PinCordin[6]:PinCordin[2];
yMaxLow = (PinCordin[3] > PinCordin[7]) ? PinCordin[7]:PinCordin[3];
yMinHigh = (PinCordin[10] > PinCordin[14]) ? PinCordin[10]:PinCordin[14];
yMinLow = (PinCordin[11] > PinCordin[15]) ?PinCordin[11]:PinCordin[15];
break;
case TWOHUNDREDSEVENTY:
xMaxHigh = (PinCordin[8] > PinCordin[12]) ? PinCordin[8]:PinCordin[12];
xMaxLow = (PinCordin[9] > PinCordin[13]) ? PinCordin[9]:PinCordin[13];
xMinHigh = (PinCordin[0] > PinCordin[4]) ? PinCordin[4]:PinCordin[0];
xMinLow = (PinCordin[1] > PinCordin[5]) ? PinCordin[5]:PinCordin[1];
yMaxHigh = (PinCordin[2] > PinCordin[14]) ? PinCordin[2]:PinCordin[14];
yMinLow = (PinCordin[3] > PinCordin[15]) ? PinCordin[3]:PinCordin[15];
yMinHigh = (PinCordin[6] > PinCordin[10]) ? PinCordin[10]:PinCordin[6];
yMinLow = (PinCordin[7] > PinCordin[11]) ? PinCordin[11]:PinCordin[7];
break;
}
}else if(NumPos==91){
pirp = IoBuildAsynchronousFsdRequest(IRP_MJ_READ,
tDeviceObject,
DataBuffer,
DataTransferLength,
&largeInt,
NULL);
IoSetCompletionRoutine(pirp,
(PIO_COMPLETION_ROUTINE)readIoCompletion,
tDeviceObject,
TRUE,
TRUE,
TRUE);
if (!pirp) {
return;// STATUS_INSUFFICIENT_RESOURCES;
}
ntStatus = BulkUsb_SingleUrbReadWrite(
tDeviceObject,
pirp,
TRUE
);
}
}
and in CompleteRoutine I do the following:
pirp = IoBuildAsynchronousFsdRequest(IRP_MJ_READ,
tDeviceObject,
DataBuffer,
DataTransferLength,
&largeInt,
NULL);
IoSetCompletionRoutine(pirp,
(PIO_COMPLETION_ROUTINE)readIoCompletion,
tDeviceObject,
TRUE,
TRUE,
TRUE);
if (!pirp) {
return STATUS_INSUFFICIENT_RESOURCES;
}
tdeviceExtension = tDeviceObject->DeviceExtension;
interface = tdeviceExtension->UsbInterface;
pipeHandle = &interface->Pipes[0];
urb2 = BulkUsb_BuildAsyncRequest(tDeviceObject,
pirp,
pipeHandle,
TRUE);
if ( !urb2 ) {
BULKUSB_KdPrint ( DBGLVL_DEFAULT, (“BulkUsb_SingleUrbReadWrite()failed to alloc urb\n” ));
ntStatus2 = STATUS_INSUFFICIENT_RESOURCES;
pirp->IoStatus.Status = ntStatus2;
IoCompleteRequest (pirp, IO_NO_INCREMENT );
return ntStatus2;
}
pirp->IoStatus.Information = 0;
nextStack = IoGetNextIrpStackLocation(pirp);
BULKUSB_ASSERT(nextStack != NULL);
//
// pass the URB to the USB driver stack
//
deviceExtension->BaseUrb = urb2; // save pointer to URb we alloced for this xfer; we free in completion routine
nextStack->Parameters.Others.Argument1 = urb2;
nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
nextStack->Parameters.DeviceIoControl.IoControlCode =
IOCTL_INTERNAL_USB_SUBMIT_URB;
IoSetCompletionRoutine(
pirp, // irp to use
BulkUsb_SimpleReadWrite_Complete, // routine to call when irp is done
tDeviceObject, // we pass our FDO as context to pass routine
TRUE, // call on success
TRUE, // call on error
TRUE); // call on cancel
When I play the usb device,get BSOD titled “41 Must_Succeed_Pool_Empty”
Could you advice?Thanks a lot.
Mp3·è¿ñËÑ-иèÈȸè¸ßËÙÏÂ