BSOD,41 Must_Succeed_Pool_Empty

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·è¿ñËÑ-иèÈȸè¸ßËÙÏÂ

Well lets start with this: “Callers of IoBuildAsynchronousFsdRequest must be running at IRQL <= APC_LEVEL.”. First fix this issue and the get back to us. By the way do you ever bother to free the IRPs that you are allocating with IoBuildAsynchronousFsdRequest?

Turn driver verifier on. Build against prefast and fix all the errors.

=====================
Mark Roddy DDK MVP
Windows 2003/XP/2000 Consulting
Hollis Technology Solutions 603-321-1032
www.hollistech.com


From: xxxxx@lists.osr.com [mailto:xxxxx@lists.osr.com] On Behalf Of Yu Zhou
Sent: Thursday, August 17, 2006 10:33 PM
To: Windows System Software Devs Interest List
Subject: [ntdev] BSOD,41 Must_Succeed_Pool_Empty

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疯狂搜-新歌热歌高速下 http: — Questions? First check the Kernel Driver FAQ at http://www.osronline.com/article.cfm?id=256 To unsubscribe, visit the List Server section of OSR Online at http://www.osronline.com/page.cfm?name=ListServer</http:>