mirror of
https://github.com/reactos/reactos.git
synced 2024-10-01 23:14:53 +00:00
Use ObOpenObjectByPointer instead of creating ourselves the IRP_MJ_CREATE/CLEANUP/CLOSE IRPs
svn path=/trunk/; revision=22729
This commit is contained in:
parent
f8b990739a
commit
5179858da1
|
@ -60,44 +60,6 @@ DeviceIoControl(
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS
|
|
||||||
SendIrp(
|
|
||||||
IN PDEVICE_OBJECT DeviceObject,
|
|
||||||
IN ULONG MajorFunction)
|
|
||||||
{
|
|
||||||
KEVENT Event;
|
|
||||||
PIRP Irp;
|
|
||||||
IO_STATUS_BLOCK IoStatus;
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
KeInitializeEvent(&Event, NotificationEvent, FALSE);
|
|
||||||
|
|
||||||
Irp = IoBuildSynchronousFsdRequest(
|
|
||||||
MajorFunction,
|
|
||||||
DeviceObject,
|
|
||||||
NULL,
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
&Event,
|
|
||||||
&IoStatus);
|
|
||||||
if (Irp == NULL)
|
|
||||||
{
|
|
||||||
DPRINT("IoBuildSynchronousFsdRequest() failed\n");
|
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
|
||||||
}
|
|
||||||
|
|
||||||
Status = IoCallDriver(DeviceObject, Irp);
|
|
||||||
|
|
||||||
if (Status == STATUS_PENDING)
|
|
||||||
{
|
|
||||||
DPRINT("Operation pending\n");
|
|
||||||
KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL);
|
|
||||||
Status = IoStatus.Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
ReadBytes(
|
ReadBytes(
|
||||||
IN PDEVICE_OBJECT LowerDevice,
|
IN PDEVICE_OBJECT LowerDevice,
|
||||||
|
@ -256,6 +218,7 @@ SerenumDetectPnpDevice(
|
||||||
IN PDEVICE_OBJECT DeviceObject,
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
IN PDEVICE_OBJECT LowerDevice)
|
IN PDEVICE_OBJECT LowerDevice)
|
||||||
{
|
{
|
||||||
|
HANDLE Handle = NULL;
|
||||||
UCHAR Buffer[256];
|
UCHAR Buffer[256];
|
||||||
ULONG BaudRate;
|
ULONG BaudRate;
|
||||||
ULONG_PTR TotalBytesReceived = 0;
|
ULONG_PTR TotalBytesReceived = 0;
|
||||||
|
@ -270,7 +233,14 @@ SerenumDetectPnpDevice(
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
/* Open port */
|
/* Open port */
|
||||||
Status = SendIrp(LowerDevice, IRP_MJ_CREATE);
|
Status = ObOpenObjectByPointer(
|
||||||
|
LowerDevice,
|
||||||
|
OBJ_KERNEL_HANDLE,
|
||||||
|
NULL,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
KernelMode,
|
||||||
|
&Handle);
|
||||||
if (!NT_SUCCESS(Status)) goto ByeBye;
|
if (!NT_SUCCESS(Status)) goto ByeBye;
|
||||||
|
|
||||||
/* 1. COM port initialization, check for device enumerate */
|
/* 1. COM port initialization, check for device enumerate */
|
||||||
|
@ -459,8 +429,8 @@ DisconnectIdle:
|
||||||
|
|
||||||
ByeBye:
|
ByeBye:
|
||||||
/* Close port */
|
/* Close port */
|
||||||
SendIrp(LowerDevice, IRP_MJ_CLOSE);
|
if (Handle)
|
||||||
SendIrp(LowerDevice, IRP_MJ_CLEANUP);
|
ZwClose(Handle);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -469,6 +439,7 @@ SerenumDetectLegacyDevice(
|
||||||
IN PDEVICE_OBJECT DeviceObject,
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
IN PDEVICE_OBJECT LowerDevice)
|
IN PDEVICE_OBJECT LowerDevice)
|
||||||
{
|
{
|
||||||
|
HANDLE Handle = NULL;
|
||||||
ULONG Fcr, Mcr;
|
ULONG Fcr, Mcr;
|
||||||
ULONG BaudRate;
|
ULONG BaudRate;
|
||||||
ULONG Command;
|
ULONG Command;
|
||||||
|
@ -490,7 +461,14 @@ SerenumDetectLegacyDevice(
|
||||||
RtlZeroMemory(Buffer, sizeof(Buffer));
|
RtlZeroMemory(Buffer, sizeof(Buffer));
|
||||||
|
|
||||||
/* Open port */
|
/* Open port */
|
||||||
Status = SendIrp(LowerDevice, IRP_MJ_CREATE);
|
Status = ObOpenObjectByPointer(
|
||||||
|
LowerDevice,
|
||||||
|
OBJ_EXCLUSIVE | OBJ_KERNEL_HANDLE,
|
||||||
|
NULL,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
KernelMode,
|
||||||
|
&Handle);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status)) return Status;
|
||||||
|
|
||||||
/* Reset UART */
|
/* Reset UART */
|
||||||
|
@ -610,7 +588,7 @@ SerenumDetectLegacyDevice(
|
||||||
|
|
||||||
ByeBye:
|
ByeBye:
|
||||||
/* Close port */
|
/* Close port */
|
||||||
SendIrp(LowerDevice, IRP_MJ_CLOSE);
|
if (Handle)
|
||||||
SendIrp(LowerDevice, IRP_MJ_CLEANUP);
|
ZwClose(Handle);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,44 +63,6 @@ DeviceIoControl(
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS
|
|
||||||
SendIrp(
|
|
||||||
IN PDEVICE_OBJECT DeviceObject,
|
|
||||||
IN ULONG MajorFunction)
|
|
||||||
{
|
|
||||||
KEVENT Event;
|
|
||||||
PIRP Irp;
|
|
||||||
IO_STATUS_BLOCK IoStatus;
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
KeInitializeEvent(&Event, NotificationEvent, FALSE);
|
|
||||||
|
|
||||||
Irp = IoBuildSynchronousFsdRequest(
|
|
||||||
MajorFunction,
|
|
||||||
DeviceObject,
|
|
||||||
NULL,
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
&Event,
|
|
||||||
&IoStatus);
|
|
||||||
if (Irp == NULL)
|
|
||||||
{
|
|
||||||
DPRINT("IoBuildSynchronousFsdRequest() failed\n");
|
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
|
||||||
}
|
|
||||||
|
|
||||||
Status = IoCallDriver(DeviceObject, Irp);
|
|
||||||
|
|
||||||
if (Status == STATUS_PENDING)
|
|
||||||
{
|
|
||||||
DPRINT("Operation pending\n");
|
|
||||||
KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL);
|
|
||||||
Status = IoStatus.Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
ReadBytes(
|
ReadBytes(
|
||||||
IN PDEVICE_OBJECT LowerDevice,
|
IN PDEVICE_OBJECT LowerDevice,
|
||||||
|
@ -155,6 +117,7 @@ SERMOUSE_MOUSE_TYPE
|
||||||
SermouseDetectLegacyDevice(
|
SermouseDetectLegacyDevice(
|
||||||
IN PDEVICE_OBJECT LowerDevice)
|
IN PDEVICE_OBJECT LowerDevice)
|
||||||
{
|
{
|
||||||
|
HANDLE Handle;
|
||||||
ULONG Fcr, Mcr;
|
ULONG Fcr, Mcr;
|
||||||
ULONG BaudRate;
|
ULONG BaudRate;
|
||||||
ULONG Command;
|
ULONG Command;
|
||||||
|
@ -170,7 +133,14 @@ SermouseDetectLegacyDevice(
|
||||||
RtlZeroMemory(Buffer, sizeof(Buffer));
|
RtlZeroMemory(Buffer, sizeof(Buffer));
|
||||||
|
|
||||||
/* Open port */
|
/* Open port */
|
||||||
Status = SendIrp(LowerDevice, IRP_MJ_CREATE);
|
Status = ObOpenObjectByPointer(
|
||||||
|
LowerDevice,
|
||||||
|
OBJ_EXCLUSIVE | OBJ_KERNEL_HANDLE,
|
||||||
|
NULL,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
KernelMode,
|
||||||
|
&Handle);
|
||||||
if (!NT_SUCCESS(Status)) return mtNone;
|
if (!NT_SUCCESS(Status)) return mtNone;
|
||||||
|
|
||||||
/* Reset UART */
|
/* Reset UART */
|
||||||
|
@ -268,7 +238,7 @@ SermouseDetectLegacyDevice(
|
||||||
|
|
||||||
ByeBye:
|
ByeBye:
|
||||||
/* Close port */
|
/* Close port */
|
||||||
SendIrp(LowerDevice, IRP_MJ_CLOSE);
|
if (Handle)
|
||||||
SendIrp(LowerDevice, IRP_MJ_CLEANUP);
|
ZwClose(Handle);
|
||||||
return MouseType;
|
return MouseType;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue