[ros-diffs] [hpoussin] 22729: Use ObOpenObjectByPointer instead of creating ourselves the IRP_MJ_CREATE/CLEANUP/CLOSE IRPs

hpoussin at svn.reactos.org hpoussin at svn.reactos.org
Fri Jun 30 23:47:42 CEST 2006


Author: hpoussin
Date: Sat Jul  1 01:47:42 2006
New Revision: 22729

URL: http://svn.reactos.org/svn/reactos?rev=22729&view=rev
Log:
Use ObOpenObjectByPointer instead of creating ourselves the IRP_MJ_CREATE/CLEANUP/CLOSE IRPs

Modified:
    trunk/reactos/drivers/bus/serenum/detect.c
    trunk/reactos/drivers/input/sermouse/detect.c

Modified: trunk/reactos/drivers/bus/serenum/detect.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/bus/serenum/detect.c?rev=22729&r1=22728&r2=22729&view=diff
==============================================================================
--- trunk/reactos/drivers/bus/serenum/detect.c (original)
+++ trunk/reactos/drivers/bus/serenum/detect.c Sat Jul  1 01:47:42 2006
@@ -55,44 +55,6 @@
 	if (OutputBufferSize)
 	{
 		*OutputBufferSize = IoStatus.Information;
-	}
-
-	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;
@@ -256,6 +218,7 @@
 	IN PDEVICE_OBJECT DeviceObject,
 	IN PDEVICE_OBJECT LowerDevice)
 {
+	HANDLE Handle = NULL;
 	UCHAR Buffer[256];
 	ULONG BaudRate;
 	ULONG_PTR TotalBytesReceived = 0;
@@ -270,7 +233,14 @@
 	NTSTATUS Status;
 
 	/* 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;
 
 	/* 1. COM port initialization, check for device enumerate */
@@ -459,8 +429,8 @@
 
 ByeBye:
 	/* Close port */
-	SendIrp(LowerDevice, IRP_MJ_CLOSE);
-	SendIrp(LowerDevice, IRP_MJ_CLEANUP);
+	if (Handle)
+		ZwClose(Handle);
 	return Status;
 }
 
@@ -469,6 +439,7 @@
 	IN PDEVICE_OBJECT DeviceObject,
 	IN PDEVICE_OBJECT LowerDevice)
 {
+	HANDLE Handle = NULL;
 	ULONG Fcr, Mcr;
 	ULONG BaudRate;
 	ULONG Command;
@@ -490,7 +461,14 @@
 	RtlZeroMemory(Buffer, sizeof(Buffer));
 
 	/* 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;
 
 	/* Reset UART */
@@ -610,7 +588,7 @@
 
 ByeBye:
 	/* Close port */
-	SendIrp(LowerDevice, IRP_MJ_CLOSE);
-	SendIrp(LowerDevice, IRP_MJ_CLEANUP);
+	if (Handle)
+		ZwClose(Handle);
 	return Status;
 }

Modified: trunk/reactos/drivers/input/sermouse/detect.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/input/sermouse/detect.c?rev=22729&r1=22728&r2=22729&view=diff
==============================================================================
--- trunk/reactos/drivers/input/sermouse/detect.c (original)
+++ trunk/reactos/drivers/input/sermouse/detect.c Sat Jul  1 01:47:42 2006
@@ -58,44 +58,6 @@
 	if (OutputBufferSize)
 	{
 		*OutputBufferSize = IoStatus.Information;
-	}
-
-	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;
@@ -155,6 +117,7 @@
 SermouseDetectLegacyDevice(
 	IN PDEVICE_OBJECT LowerDevice)
 {
+	HANDLE Handle;
 	ULONG Fcr, Mcr;
 	ULONG BaudRate;
 	ULONG Command;
@@ -170,7 +133,14 @@
 	RtlZeroMemory(Buffer, sizeof(Buffer));
 
 	/* 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;
 
 	/* Reset UART */
@@ -268,7 +238,7 @@
 
 ByeBye:
 	/* Close port */
-	SendIrp(LowerDevice, IRP_MJ_CLOSE);
-	SendIrp(LowerDevice, IRP_MJ_CLEANUP);
+	if (Handle)
+		ZwClose(Handle);
 	return MouseType;
 }




More information about the Ros-diffs mailing list