From: Leo Havm�ller on
> nextStack = IoGetNextIrpStackLocation(irp);
> nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;

These are not needed.

> ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject,
> irp);

What is the ntStatus returned?

Leo Havmýller.


From: polybear on

When system resume from suspend power status, my device must be reset.


Since there are no IRP_MN_WAIT_WAKE .
(I guess that IRP_MN_WAIT_WAKE not been receipted because this device is not
a remote-wakeup supported device.)

I call this cycle port function when the system power chang to working power
status
(in IRP_MN_SET_POWER).

==========================================================================
NTSTATUS ntStatus, status = STATUS_SUCCESS;
PIRP irp;
KEVENT event;
IO_STATUS_BLOCK ioStatus;
// PIO_STACK_LOCATION nextStack;
PDEVICE_EXTENSION deviceExtension;

BULKUSB_KdPrint( DBGLVL_DEFAULT,("enter BulkUsb_CyclePort\n"));

deviceExtension = DeviceObject->DeviceExtension;
KeInitializeEvent(&event, NotificationEvent, FALSE);

irp = IoBuildDeviceIoControlRequest(
IOCTL_INTERNAL_USB_CYCLE_PORT,
deviceExtension->TopOfStackDeviceObject,
NULL,
0,
NULL,
0,
TRUE, // internal ( use IRP_MJ_INTERNAL_DEVICE_CONTROL )
&event,
&ioStatus);


// nextStack = IoGetNextIrpStackLocation(irp);
// nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
// nextStack->Parameters.DeviceIoControl.IoControlCode =
// IOCTL_INTERNAL_USB_CYCLE_PORT;

// BULKUSB_ASSERT(nextStack != NULL);

BULKUSB_KdPrint( DBGLVL_DEFAULT,("BulkUsb_CyclePort() calling USBD
reset port api\n"));

ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject,
irp);

BULKUSB_KdPrint( DBGLVL_DEFAULT,("BulkUsb_CyclePort() return from
IoCallDriver USBD %x\n", ntStatus));

if (ntStatus == STATUS_PENDING) {

BULKUSB_KdPrint( DBGLVL_DEFAULT,("BulkUsb_CyclePort() Wait for
single object\n"));

status = KeWaitForSingleObject(
&event,
Suspended,
KernelMode,
FALSE,
NULL);

BULKUSB_KdPrint( DBGLVL_DEFAULT,("BulkUsb_CyclePort() Wait for
single object, returned %x\n", status));

} else {
ioStatus.Status = ntStatus;
}

//
// USBD maps the error code for us
//
ntStatus = ioStatus.Status;

BULKUSB_KdPrint( DBGLVL_DEFAULT,("Exit BulkUsb_CyclePort (%x)\n",
ntStatus));

return ntStatus;

==Result====================================================================
==============

enter BulkUsb_CyclePort
BulkUsb:
BulkUsb_CyclePort() calling USBD reset port api
BulkUsb:
BulkUsb_CyclePort() return from IoCallDriver USBD c000000d
BulkUsb:
Exit BulkUsb_CyclePort (c000000d)



"Leo Havmýller" <rtxleh(a)nospam.nospam> ýýýgýýlýýsýD
:ODTpDqlGFHA.3912(a)TK2MSFTNGP10.phx.gbl...
> > nextStack = IoGetNextIrpStackLocation(irp);
> > nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
>
> These are not needed.
>
> > ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject,
> > irp);
>
> What is the ntStatus returned?
>
> Leo Havmýller.
>
>


From: Alexander Grigoriev on
Windows usually reenumerates the bus after return from suspend. This should
involve a reset. Check it with USB analyzer.

"polybear" <polybear(a)no-sp> wrote in message
news:e8UWzUmGFHA.3912(a)TK2MSFTNGP10.phx.gbl...
>
> When system resume from suspend power status, my device must be reset.
>
>
> Since there are no IRP_MN_WAIT_WAKE .
> (I guess that IRP_MN_WAIT_WAKE not been receipted because this device is
> not
> a remote-wakeup supported device.)
>
> I call this cycle port function when the system power chang to working
> power
> status
> (in IRP_MN_SET_POWER).
>
> ==========================================================================
> NTSTATUS ntStatus, status = STATUS_SUCCESS;
> PIRP irp;
> KEVENT event;
> IO_STATUS_BLOCK ioStatus;
> // PIO_STACK_LOCATION nextStack;
> PDEVICE_EXTENSION deviceExtension;
>
> BULKUSB_KdPrint( DBGLVL_DEFAULT,("enter BulkUsb_CyclePort\n"));
>
> deviceExtension = DeviceObject->DeviceExtension;
> KeInitializeEvent(&event, NotificationEvent, FALSE);
>
> irp = IoBuildDeviceIoControlRequest(
> IOCTL_INTERNAL_USB_CYCLE_PORT,
> deviceExtension->TopOfStackDeviceObject,
> NULL,
> 0,
> NULL,
> 0,
> TRUE, // internal ( use
> IRP_MJ_INTERNAL_DEVICE_CONTROL )
> &event,
> &ioStatus);
>
>
> // nextStack = IoGetNextIrpStackLocation(irp);
> // nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
> // nextStack->Parameters.DeviceIoControl.IoControlCode =
> // IOCTL_INTERNAL_USB_CYCLE_PORT;
>
> // BULKUSB_ASSERT(nextStack != NULL);
>
> BULKUSB_KdPrint( DBGLVL_DEFAULT,("BulkUsb_CyclePort() calling USBD
> reset port api\n"));
>
> ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject,
> irp);
>
> BULKUSB_KdPrint( DBGLVL_DEFAULT,("BulkUsb_CyclePort() return from
> IoCallDriver USBD %x\n", ntStatus));
>
> if (ntStatus == STATUS_PENDING) {
>
> BULKUSB_KdPrint( DBGLVL_DEFAULT,("BulkUsb_CyclePort() Wait for
> single object\n"));
>
> status = KeWaitForSingleObject(
> &event,
> Suspended,
> KernelMode,
> FALSE,
> NULL);
>
> BULKUSB_KdPrint( DBGLVL_DEFAULT,("BulkUsb_CyclePort() Wait for
> single object, returned %x\n", status));
>
> } else {
> ioStatus.Status = ntStatus;
> }
>
> //
> // USBD maps the error code for us
> //
> ntStatus = ioStatus.Status;
>
> BULKUSB_KdPrint( DBGLVL_DEFAULT,("Exit BulkUsb_CyclePort (%x)\n",
> ntStatus));
>
> return ntStatus;
>
> ==Result====================================================================
> ==============
>
> enter BulkUsb_CyclePort
> BulkUsb:
> BulkUsb_CyclePort() calling USBD reset port api
> BulkUsb:
> BulkUsb_CyclePort() return from IoCallDriver USBD c000000d
> BulkUsb:
> Exit BulkUsb_CyclePort (c000000d)
>
>
>
> "Leo Havmýller" <rtxleh(a)nospam.nospam> ýýýgýýlýýsýD
> :ODTpDqlGFHA.3912(a)TK2MSFTNGP10.phx.gbl...
>> > nextStack = IoGetNextIrpStackLocation(irp);
>> > nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
>>
>> These are not needed.
>>
>> > ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject,
>> > irp);
>>
>> What is the ntStatus returned?
>>
>> Leo Havmýller.
>>
>>
>
>


From: polybear on
I had chatched the record by CATC from system suspend. but i found that not
all of them involve reset device.
(ex. windows 2000 and intel 1.1 USB host )
there was a "resume" behind "suspend" on the bus , on any reset had been
record.
-:~
poly

"Alexander Grigoriev" <alegr(a)earthlink.net> ýýýgýýlýýsýD
:eR7J6ouGFHA.3068(a)tk2msftngp13.phx.gbl...
> Windows usually reenumerates the bus after return from suspend. This
should
> involve a reset. Check it with USB analyzer.
>
> "polybear" <polybear(a)no-sp> wrote in message
> news:e8UWzUmGFHA.3912(a)TK2MSFTNGP10.phx.gbl...
> >
> > When system resume from suspend power status, my device must be reset.
> >
> >
> > Since there are no IRP_MN_WAIT_WAKE .
> > (I guess that IRP_MN_WAIT_WAKE not been receipted because this device is
> > not
> > a remote-wakeup supported device.)
> >
> > I call this cycle port function when the system power chang to working
> > power
> > status
> > (in IRP_MN_SET_POWER).
> >
> >
==========================================================================
> > NTSTATUS ntStatus, status = STATUS_SUCCESS;
> > PIRP irp;
> > KEVENT event;
> > IO_STATUS_BLOCK ioStatus;
> > // PIO_STACK_LOCATION nextStack;
> > PDEVICE_EXTENSION deviceExtension;
> >
> > BULKUSB_KdPrint( DBGLVL_DEFAULT,("enter BulkUsb_CyclePort\n"));
> >
> > deviceExtension = DeviceObject->DeviceExtension;
> > KeInitializeEvent(&event, NotificationEvent, FALSE);
> >
> > irp = IoBuildDeviceIoControlRequest(
> > IOCTL_INTERNAL_USB_CYCLE_PORT,
> > deviceExtension->TopOfStackDeviceObject,
> > NULL,
> > 0,
> > NULL,
> > 0,
> > TRUE, // internal ( use
> > IRP_MJ_INTERNAL_DEVICE_CONTROL )
> > &event,
> > &ioStatus);
> >
> >
> > // nextStack = IoGetNextIrpStackLocation(irp);
> > // nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
> > // nextStack->Parameters.DeviceIoControl.IoControlCode =
> > // IOCTL_INTERNAL_USB_CYCLE_PORT;
> >
> > // BULKUSB_ASSERT(nextStack != NULL);
> >
> > BULKUSB_KdPrint( DBGLVL_DEFAULT,("BulkUsb_CyclePort() calling
USBD
> > reset port api\n"));
> >
> > ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject,
> > irp);
> >
> > BULKUSB_KdPrint( DBGLVL_DEFAULT,("BulkUsb_CyclePort() return from
> > IoCallDriver USBD %x\n", ntStatus));
> >
> > if (ntStatus == STATUS_PENDING) {
> >
> > BULKUSB_KdPrint( DBGLVL_DEFAULT,("BulkUsb_CyclePort() Wait
for
> > single object\n"));
> >
> > status = KeWaitForSingleObject(
> > &event,
> > Suspended,
> > KernelMode,
> > FALSE,
> > NULL);
> >
> > BULKUSB_KdPrint( DBGLVL_DEFAULT,("BulkUsb_CyclePort() Wait
for
> > single object, returned %x\n", status));
> >
> > } else {
> > ioStatus.Status = ntStatus;
> > }
> >
> > //
> > // USBD maps the error code for us
> > //
> > ntStatus = ioStatus.Status;
> >
> > BULKUSB_KdPrint( DBGLVL_DEFAULT,("Exit BulkUsb_CyclePort (%x)\n",
> > ntStatus));
> >
> > return ntStatus;
> >
> >
==Result====================================================================
> > ==============
> >
> > enter BulkUsb_CyclePort
> > BulkUsb:
> > BulkUsb_CyclePort() calling USBD reset port api
> > BulkUsb:
> > BulkUsb_CyclePort() return from IoCallDriver USBD c000000d
> > BulkUsb:
> > Exit BulkUsb_CyclePort (c000000d)
> >
> >
> >
> > "Leo Havmýller" <rtxleh(a)nospam.nospam> ýýýgýýlýýsýD
> > :ODTpDqlGFHA.3912(a)TK2MSFTNGP10.phx.gbl...
> >> > nextStack = IoGetNextIrpStackLocation(irp);
> >> > nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
> >>
> >> These are not needed.
> >>
> >> > ntStatus =
IoCallDriver(deviceExtension->TopOfStackDeviceObject,
> >> > irp);
> >>
> >> What is the ntStatus returned?
> >>
> >> Leo Havmýller.
> >>
> >>
> >
> >
>
>


From: Doron Holan [MS] on
this cycle port IOCTL will actually cause your device to be surprise
removed. that means that if an app has a handle open to your device, it
will have to reopen the handle every time the machine comes back from low
power.

d

--
Please do not send e-mail directly to this alias. this alias is for
newsgroup purposes only.
This posting is provided "AS IS" with no warranties, and confers no rights.


"Alexander Grigoriev" <alegr(a)earthlink.net> wrote in message
news:eR7J6ouGFHA.3068(a)tk2msftngp13.phx.gbl...
> Windows usually reenumerates the bus after return from suspend. This
> should involve a reset. Check it with USB analyzer.
>
> "polybear" <polybear(a)no-sp> wrote in message
> news:e8UWzUmGFHA.3912(a)TK2MSFTNGP10.phx.gbl...
>>
>> When system resume from suspend power status, my device must be reset.
>>
>>
>> Since there are no IRP_MN_WAIT_WAKE .
>> (I guess that IRP_MN_WAIT_WAKE not been receipted because this device is
>> not
>> a remote-wakeup supported device.)
>>
>> I call this cycle port function when the system power chang to working
>> power
>> status
>> (in IRP_MN_SET_POWER).
>>
>> ==========================================================================
>> NTSTATUS ntStatus, status = STATUS_SUCCESS;
>> PIRP irp;
>> KEVENT event;
>> IO_STATUS_BLOCK ioStatus;
>> // PIO_STACK_LOCATION nextStack;
>> PDEVICE_EXTENSION deviceExtension;
>>
>> BULKUSB_KdPrint( DBGLVL_DEFAULT,("enter BulkUsb_CyclePort\n"));
>>
>> deviceExtension = DeviceObject->DeviceExtension;
>> KeInitializeEvent(&event, NotificationEvent, FALSE);
>>
>> irp = IoBuildDeviceIoControlRequest(
>> IOCTL_INTERNAL_USB_CYCLE_PORT,
>> deviceExtension->TopOfStackDeviceObject,
>> NULL,
>> 0,
>> NULL,
>> 0,
>> TRUE, // internal ( use
>> IRP_MJ_INTERNAL_DEVICE_CONTROL )
>> &event,
>> &ioStatus);
>>
>>
>> // nextStack = IoGetNextIrpStackLocation(irp);
>> // nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
>> // nextStack->Parameters.DeviceIoControl.IoControlCode =
>> // IOCTL_INTERNAL_USB_CYCLE_PORT;
>>
>> // BULKUSB_ASSERT(nextStack != NULL);
>>
>> BULKUSB_KdPrint( DBGLVL_DEFAULT,("BulkUsb_CyclePort() calling USBD
>> reset port api\n"));
>>
>> ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject,
>> irp);
>>
>> BULKUSB_KdPrint( DBGLVL_DEFAULT,("BulkUsb_CyclePort() return from
>> IoCallDriver USBD %x\n", ntStatus));
>>
>> if (ntStatus == STATUS_PENDING) {
>>
>> BULKUSB_KdPrint( DBGLVL_DEFAULT,("BulkUsb_CyclePort() Wait for
>> single object\n"));
>>
>> status = KeWaitForSingleObject(
>> &event,
>> Suspended,
>> KernelMode,
>> FALSE,
>> NULL);
>>
>> BULKUSB_KdPrint( DBGLVL_DEFAULT,("BulkUsb_CyclePort() Wait for
>> single object, returned %x\n", status));
>>
>> } else {
>> ioStatus.Status = ntStatus;
>> }
>>
>> //
>> // USBD maps the error code for us
>> //
>> ntStatus = ioStatus.Status;
>>
>> BULKUSB_KdPrint( DBGLVL_DEFAULT,("Exit BulkUsb_CyclePort (%x)\n",
>> ntStatus));
>>
>> return ntStatus;
>>
>> ==Result====================================================================
>> ==============
>>
>> enter BulkUsb_CyclePort
>> BulkUsb:
>> BulkUsb_CyclePort() calling USBD reset port api
>> BulkUsb:
>> BulkUsb_CyclePort() return from IoCallDriver USBD c000000d
>> BulkUsb:
>> Exit BulkUsb_CyclePort (c000000d)
>>
>>
>>
>> "Leo Havmýller" <rtxleh(a)nospam.nospam> ýýýgýýlýýsýD
>> :ODTpDqlGFHA.3912(a)TK2MSFTNGP10.phx.gbl...
>>> > nextStack = IoGetNextIrpStackLocation(irp);
>>> > nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
>>>
>>> These are not needed.
>>>
>>> > ntStatus =
>>> > IoCallDriver(deviceExtension->TopOfStackDeviceObject,
>>> > irp);
>>>
>>> What is the ntStatus returned?
>>>
>>> Leo Havmýller.
>>>
>>>
>>
>>
>
>