Author: tkreuzer
Date: Sat Sep 29 22:44:48 2012
New Revision: 57437
URL:
http://svn.reactos.org/svn/reactos?rev=57437&view=rev
Log:
[CLASSPNP]
- Make srb volatile, since it's assigned inside SEH and referenced in finally
[NTOSKRNL]
- FsRtlTeardownPerStreamContexts: make IsMutexLocked volatile (SEH)
- IoCreateFile: Make SystemEaBuffer volatile (SEH), save status and information in the
caller's IoStatusBlock, cleanup and fail when IoCheckEaBufferValidity failed with
PreviousMode == KernelMode, too.
- NtLockFile: Move ExAllocatePoolWithTag out of the SEH block. ExAllocatePoolWithTag does
not raise an exception by default (unlike ExAllocatePoolWithQuotaTag). Get rid of this SEH
block completely and check the return value instead.
- NtQueryDirectoryFile: make AuxBuffer volatile (SEH), again move ExAllocatePoolWithTag
out of the SEH block and check return value instead.
IopCaptureUnicodeString: Make Name volatile (SEH)
Modified:
trunk/reactos/drivers/storage/classpnp/create.c
trunk/reactos/ntoskrnl/fsrtl/filtrctx.c
trunk/reactos/ntoskrnl/io/iomgr/file.c
trunk/reactos/ntoskrnl/io/iomgr/iofunc.c
trunk/reactos/ntoskrnl/io/pnpmgr/plugplay.c
Modified: trunk/reactos/drivers/storage/classpnp/create.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/classpnp/c…
==============================================================================
--- trunk/reactos/drivers/storage/classpnp/create.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/storage/classpnp/create.c [iso-8859-1] Sat Sep 29 22:44:48 2012
@@ -444,8 +444,8 @@
#if 1
/*
- * BUGBUG REMOVE this old function implementation as soon as the
- * boottime pagefile problems with the new one (below)
+ * BUGBUG REMOVE this old function implementation as soon as the
+ * boottime pagefile problems with the new one (below)
* are resolved.
*/
NTSTATUS
@@ -460,10 +460,10 @@
PFUNCTIONAL_DEVICE_EXTENSION FdoExtension = Fdo->DeviceExtension;
PCOMMON_DEVICE_EXTENSION commonExtension =
(PCOMMON_DEVICE_EXTENSION) FdoExtension;
-
+
PFILE_OBJECT_EXTENSION fsContext = NULL;
NTSTATUS status;
- PSCSI_REQUEST_BLOCK srb = NULL;
+ volatile PSCSI_REQUEST_BLOCK srb = NULL;
BOOLEAN countChanged = FALSE;
PAGED_CODE();
@@ -508,7 +508,7 @@
//
if(LockType == SecureMediaLock) {
-
+
PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);
PFILE_OBJECT fileObject = irpStack->FileObject;
@@ -563,7 +563,7 @@
break;
}
}
-
+
} else {
//
@@ -621,25 +621,25 @@
srb->CdbLength = 6;
cdb->MEDIA_REMOVAL.OperationCode = SCSIOP_MEDIUM_REMOVAL;
-
+
//
// TRUE - prevent media removal.
// FALSE - allow media removal.
//
-
+
cdb->MEDIA_REMOVAL.Prevent = Lock;
-
+
//
// Set timeout value.
//
-
+
srb->TimeOutValue = FdoExtension->TimeOutValue;
-
+
//
// The actual lock operation on the device isn't so important
// as the internal lock counts. Ignore failures.
//
-
+
status = ClassSendSrbSynchronous(FdoExtension->DeviceObject,
srb,
NULL,
@@ -653,7 +653,7 @@
DebugPrint((2,
"ClasspEjectionControl: FAILED status %x -- "
"reverting lock counts\n", status));
-
+
if (countChanged) {
//
@@ -662,7 +662,7 @@
//
if(Lock) {
-
+
switch(LockType) {
case SimpleMediaLock: {
@@ -755,9 +755,9 @@
BOOLEAN fileHandleOk = TRUE;
BOOLEAN countChanged = FALSE;
NTSTATUS status;
-
+
PAGED_CODE();
-
+
status = KeWaitForSingleObject(
&fdoExt->EjectSynchronizationEvent,
UserRequest,
@@ -803,7 +803,7 @@
fdoExt->LockCount++;
countChanged = TRUE;
break;
- case SecureMediaLock:
+ case SecureMediaLock:
fsContext->LockCount++;
fdoExt->ProtectedLockCount++;
countChanged = TRUE;
@@ -813,14 +813,14 @@
countChanged = TRUE;
break;
}
- }
+ }
else {
/*
* This is an unlock command. If it's a secured one then make sure
* the caller has a lock outstanding or return an error.
*/
switch (LockType){
- case SimpleMediaLock:
+ case SimpleMediaLock:
if (fdoExt->LockCount > 0){
fdoExt->LockCount--;
countChanged = TRUE;
@@ -859,7 +859,7 @@
(fdoExt->ProtectedLockCount ||
fdoExt->InternalLockCount ||
fdoExt->LockCount)){
-
+
/*
* The lock count is still positive, so don't unlock yet.
*/
@@ -873,14 +873,14 @@
}
else {
TRANSFER_PACKET *pkt;
-
+
pkt = DequeueFreeTransferPacket(Fdo, TRUE);
if (pkt){
KEVENT event;
-
+
/*
* Store the number of packets servicing the irp (one)
- * inside the original IRP. It will be used to counted down
+ * inside the original IRP. It will be used to counted down
* to zero when the packet completes.
* Initialize the original IRP's status to success.
* If the packet fails, we will set it to the error status.
@@ -893,10 +893,10 @@
* and wait for the packet to complete. The result
* status will be written to the original irp.
*/
- KeInitializeEvent(&event, SynchronizationEvent, FALSE);
+ KeInitializeEvent(&event, SynchronizationEvent, FALSE);
SetupEjectionTransferPacket(pkt, Lock, &event, Irp);
SubmitTransferPacket(pkt);
- KeWaitForSingleObject(&event, Executive, KernelMode, FALSE,
NULL);
+ KeWaitForSingleObject(&event, Executive, KernelMode, FALSE,
NULL);
status = Irp->IoStatus.Status;
}
else {
@@ -961,7 +961,7 @@
}
-
+
KeSetEvent(&fdoExt->EjectSynchronizationEvent, IO_NO_INCREMENT, FALSE);
return status;
Modified: trunk/reactos/ntoskrnl/fsrtl/filtrctx.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/fsrtl/filtrctx.c?…
==============================================================================
--- trunk/reactos/ntoskrnl/fsrtl/filtrctx.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/fsrtl/filtrctx.c [iso-8859-1] Sat Sep 29 22:44:48 2012
@@ -368,7 +368,7 @@
FsRtlTeardownPerStreamContexts(IN PFSRTL_ADVANCED_FCB_HEADER AdvFcbHeader)
{
PLIST_ENTRY NextEntry;
- BOOLEAN IsMutexLocked = FALSE;
+ volatile BOOLEAN IsMutexLocked = FALSE;
PFSRTL_PER_STREAM_CONTEXT PerStreamContext;
_SEH2_TRY
Modified: trunk/reactos/ntoskrnl/io/iomgr/file.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/file.c?r…
==============================================================================
--- trunk/reactos/ntoskrnl/io/iomgr/file.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/io/iomgr/file.c [iso-8859-1] Sat Sep 29 22:44:48 2012
@@ -1700,8 +1700,8 @@
KPROCESSOR_MODE AccessMode;
HANDLE LocalHandle = 0;
LARGE_INTEGER SafeAllocationSize;
- PVOID SystemEaBuffer = NULL;
- NTSTATUS Status;
+ volatile PVOID SystemEaBuffer = NULL;
+ NTSTATUS Status = STATUS_SUCCESS;
OPEN_PACKET OpenPacket;
ULONG EaErrorOffset;
@@ -1738,9 +1738,7 @@
if ((EaBuffer) && (EaLength))
{
- ProbeForRead(EaBuffer,
- EaLength,
- sizeof(ULONG));
+ ProbeForRead(EaBuffer, EaLength, sizeof(ULONG));
/* marshal EaBuffer */
SystemEaBuffer = ExAllocatePoolWithTag(NonPagedPool,
@@ -1757,24 +1755,14 @@
Status = IoCheckEaBufferValidity(SystemEaBuffer,
EaLength,
&EaErrorOffset);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("FIXME: IoCheckEaBufferValidity() failed with "
- "Status: %lx\n",Status);
-
- /* Free EA Buffer and return the error */
- ExFreePoolWithTag(SystemEaBuffer, TAG_EA);
- _SEH2_YIELD(return Status);
- }
+ IoStatusBlock->Status = Status;
+ IoStatusBlock->Information = EaErrorOffset;
}
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
- /* Free SystemEaBuffer if needed */
- if (SystemEaBuffer) ExFreePoolWithTag(SystemEaBuffer, TAG_EA);
-
/* Return the exception code */
- _SEH2_YIELD(return _SEH2_GetExceptionCode());
+ Status = _SEH2_GetExceptionCode();
}
_SEH2_END;
}
@@ -1816,12 +1804,19 @@
Status = IoCheckEaBufferValidity(SystemEaBuffer,
EaLength,
&EaErrorOffset);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("FIXME: IoCheckEaBufferValidity() failed with "
- "Status: %lx\n",Status);
- }
- }
+ IoStatusBlock->Status = Status;
+ IoStatusBlock->Information = EaErrorOffset;
+ }
+ }
+
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("FIXME: IoCheckEaBufferValidity() failed with Status: %lx\n",
+ Status);
+
+ /* Free SystemEaBuffer if needed and return the error */
+ if (SystemEaBuffer) ExFreePoolWithTag(SystemEaBuffer, TAG_EA);
+ return Status;
}
/* Setup the Open Packet */
Modified: trunk/reactos/ntoskrnl/io/iomgr/iofunc.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/iofunc.c…
==============================================================================
--- trunk/reactos/ntoskrnl/io/iomgr/iofunc.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/io/iomgr/iofunc.c [iso-8859-1] Sat Sep 29 22:44:48 2012
@@ -1330,29 +1330,21 @@
StackPtr->MinorFunction = IRP_MN_LOCK;
StackPtr->FileObject = FileObject;
- /* Enter SEH */
- _SEH2_TRY
- {
- /* Allocate local buffer */
- LocalLength = ExAllocatePoolWithTag(NonPagedPool,
- sizeof(LARGE_INTEGER),
- TAG_LOCK);
-
- /* Set the length */
- *LocalLength = CapturedLength;
- Irp->Tail.Overlay.AuxiliaryBuffer = (PVOID)LocalLength;
- StackPtr->Parameters.LockControl.Length = LocalLength;
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- /* Allocating failed, clean up and return the exception code */
+ /* Allocate local buffer */
+ LocalLength = ExAllocatePoolWithTag(NonPagedPool,
+ sizeof(LARGE_INTEGER),
+ TAG_LOCK);
+ if (!LocalLength)
+ {
+ /* Allocating failed, clean up and return failure */
IopCleanupAfterException(FileObject, Irp, Event, NULL);
- if (LocalLength) ExFreePoolWithTag(LocalLength, TAG_LOCK);
-
- /* Return the exception code */
- _SEH2_YIELD(return _SEH2_GetExceptionCode());
- }
- _SEH2_END;
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* Set the length */
+ *LocalLength = CapturedLength;
+ Irp->Tail.Overlay.AuxiliaryBuffer = (PVOID)LocalLength;
+ StackPtr->Parameters.LockControl.Length = LocalLength;
/* Set Parameters */
StackPtr->Parameters.LockControl.ByteOffset = CapturedByteOffset;
@@ -1397,7 +1389,7 @@
NTSTATUS Status;
BOOLEAN LockedForSynch = FALSE;
PKEVENT Event = NULL;
- PVOID AuxBuffer = NULL;
+ volatile PVOID AuxBuffer = NULL;
PMDL Mdl;
UNICODE_STRING CapturedFileName;
PUNICODE_STRING SearchPattern;
@@ -1526,25 +1518,19 @@
/* Check if this is buffered I/O */
if (DeviceObject->Flags & DO_BUFFERED_IO)
{
- /* Enter SEH */
- _SEH2_TRY
- {
- /* Allocate a buffer */
- Irp->AssociatedIrp.SystemBuffer =
- ExAllocatePoolWithTag(NonPagedPool,
- Length,
- TAG_SYSB);
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ /* Allocate a buffer */
+ Irp->AssociatedIrp.SystemBuffer = ExAllocatePoolWithTag(NonPagedPool,
+ Length,
+ TAG_SYSB);
+ if (!Irp->AssociatedIrp.SystemBuffer)
{
/* Allocating failed, clean up and return the exception code */
IopCleanupAfterException(FileObject, Irp, Event, NULL);
if (AuxBuffer) ExFreePoolWithTag(AuxBuffer, TAG_SYSB);
/* Return the exception code */
- _SEH2_YIELD(return _SEH2_GetExceptionCode());
- }
- _SEH2_END;
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
/* Set the buffer and flags */
Irp->UserBuffer = FileInformation;
Modified: trunk/reactos/ntoskrnl/io/pnpmgr/plugplay.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/pnpmgr/plugpla…
==============================================================================
--- trunk/reactos/ntoskrnl/io/pnpmgr/plugplay.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/io/pnpmgr/plugplay.c [iso-8859-1] Sat Sep 29 22:44:48 2012
@@ -167,7 +167,7 @@
IopCaptureUnicodeString(PUNICODE_STRING DstName, PUNICODE_STRING SrcName)
{
NTSTATUS Status = STATUS_SUCCESS;
- UNICODE_STRING Name;
+ volatile UNICODE_STRING Name;
Name.Buffer = NULL;
_SEH2_TRY