[STORPORT] Fix x64 build
[reactos.git] / ntoskrnl / fsrtl / filelock.c
index 1e05421..d42e35b 100644 (file)
@@ -51,6 +51,10 @@ typedef struct _LOCK_SHARED_RANGE
 }
     LOCK_SHARED_RANGE, *PLOCK_SHARED_RANGE;
 
+#define TAG_TABLE 'LTAB'
+#define TAG_RANGE 'FSRA'
+#define TAG_FLOCK 'FLCK'
+
 /* PRIVATE FUNCTIONS *********************************************************/
 
 VOID
@@ -67,15 +71,15 @@ FsRtlCompleteLockIrpReal(IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteRoutine,
 static PVOID NTAPI LockAllocate(PRTL_GENERIC_TABLE Table, CLONG Bytes)
 {
     PVOID Result;
-    Result = ExAllocatePoolWithTag(NonPagedPool, Bytes, 'LTAB');
-    DPRINT("LockAllocate(%d) => %p\n", Bytes, Result);
+    Result = ExAllocatePoolWithTag(NonPagedPool, Bytes, TAG_TABLE);
+    DPRINT("LockAllocate(%lu) => %p\n", Bytes, Result);
     return Result;
 }
 
 static VOID NTAPI LockFree(PRTL_GENERIC_TABLE Table, PVOID Buffer)
 {
     DPRINT("LockFree(%p)\n", Buffer);
-    ExFreePoolWithTag(Buffer, 'LTAB');
+    ExFreePoolWithTag(Buffer, TAG_TABLE);
 }
 
 static RTL_GENERIC_COMPARE_RESULTS NTAPI LockCompare
@@ -343,7 +347,7 @@ FsRtlPrivateLock(IN PFILE_LOCK FileLock,
     ULARGE_INTEGER UnsignedStart;
     ULARGE_INTEGER UnsignedEnd;
     
-    DPRINT("FsRtlPrivateLock(%wZ, Offset %08x%08x (%d), Length %08x%08x (%d), Key %x, FailImmediately %d, Exclusive %d)\n", 
+    DPRINT("FsRtlPrivateLock(%wZ, Offset %08x%08x (%d), Length %08x%08x (%d), Key %x, FailImmediately %u, Exclusive %u)\n", 
            &FileObject->FileName, 
            FileOffset->HighPart,
            FileOffset->LowPart, 
@@ -379,7 +383,7 @@ FsRtlPrivateLock(IN PFILE_LOCK FileLock,
     /* Initialize the lock, if necessary */
     if (!FileLock->LockInformation)
     {
-        LockInfo = ExAllocatePoolWithTag(NonPagedPool, sizeof(LOCK_INFORMATION), 'FLCK');
+        LockInfo = ExAllocatePoolWithTag(NonPagedPool, sizeof(LOCK_INFORMATION), TAG_FLOCK);
         if (!LockInfo)
         {
             IoStatus->Status = STATUS_NO_MEMORY;
@@ -414,7 +418,7 @@ FsRtlPrivateLock(IN PFILE_LOCK FileLock,
     ToInsert.Exclusive.FileLock.FileObject = FileObject;
     ToInsert.Exclusive.FileLock.StartingByte = *FileOffset;
     ToInsert.Exclusive.FileLock.EndingByte.QuadPart = FileOffset->QuadPart + Length->QuadPart;
-    ToInsert.Exclusive.FileLock.ProcessId = Process->UniqueProcessId;
+    ToInsert.Exclusive.FileLock.ProcessId = Process;
     ToInsert.Exclusive.FileLock.Key = Key;
     ToInsert.Exclusive.FileLock.ExclusiveLock = ExclusiveLock;
 
@@ -428,7 +432,7 @@ FsRtlPrivateLock(IN PFILE_LOCK FileLock,
     {
         if (Conflict->Exclusive.FileLock.ExclusiveLock || ExclusiveLock)
         {
-            DPRINT("Conflict %08x%08x:%08x%08x Exc %d (Want Exc %d)\n",
+            DPRINT("Conflict %08x%08x:%08x%08x Exc %u (Want Exc %u)\n",
                    Conflict->Exclusive.FileLock.StartingByte.HighPart,
                    Conflict->Exclusive.FileLock.StartingByte.LowPart,
                    Conflict->Exclusive.FileLock.EndingByte.HighPart,
@@ -514,33 +518,30 @@ FsRtlPrivateLock(IN PFILE_LOCK FileLock,
                         }
                         return FALSE;
                     }
-                    else
-                    {
-                        DPRINT("Overlapping shared lock %wZ %08x%08x %08x%08x\n",
-                               &FileObject->FileName,
-                               Conflict->Exclusive.FileLock.StartingByte.HighPart,
-                               Conflict->Exclusive.FileLock.StartingByte.LowPart,
-                               Conflict->Exclusive.FileLock.EndingByte.HighPart,
-                               Conflict->Exclusive.FileLock.EndingByte.LowPart);
-                        Conflict = FsRtlpRebuildSharedLockRange(FileLock,
-                                                                LockInfo,
-                                                                &ToInsert);
-                        if (!Conflict)
-                        {
-                            IoStatus->Status = STATUS_NO_MEMORY;
-                            if (Irp)
-                            {
-                                FsRtlCompleteLockIrpReal
-                                    (FileLock->CompleteLockIrpRoutine,
-                                     Context,
-                                     Irp,
-                                     IoStatus->Status,
-                                     &Status,
-                                     FileObject);
-                            }
-                            break;
-                        }
-                    }
+                }
+            }
+            
+            DPRINT("Overlapping shared lock %wZ %08x%08x %08x%08x\n",
+                   &FileObject->FileName,
+                   Conflict->Exclusive.FileLock.StartingByte.HighPart,
+                   Conflict->Exclusive.FileLock.StartingByte.LowPart,
+                   Conflict->Exclusive.FileLock.EndingByte.HighPart,
+                   Conflict->Exclusive.FileLock.EndingByte.LowPart);
+            Conflict = FsRtlpRebuildSharedLockRange(FileLock,
+                                                    LockInfo,
+                                                    &ToInsert);
+            if (!Conflict)
+            {
+                IoStatus->Status = STATUS_NO_MEMORY;
+                if (Irp)
+                {
+                    FsRtlCompleteLockIrpReal
+                        (FileLock->CompleteLockIrpRoutine,
+                         Context,
+                         Irp,
+                         IoStatus->Status,
+                         &Status,
+                         FileObject);
                 }
             }
 
@@ -550,7 +551,7 @@ FsRtlPrivateLock(IN PFILE_LOCK FileLock,
             
             DPRINT("Adding shared lock %wZ\n", &FileObject->FileName);
             NewSharedRange = 
-                ExAllocatePoolWithTag(NonPagedPool, sizeof(*NewSharedRange), 'FSRA');
+                ExAllocatePoolWithTag(NonPagedPool, sizeof(*NewSharedRange), TAG_RANGE);
             if (!NewSharedRange)
             {
                 IoStatus->Status = STATUS_NO_MEMORY;
@@ -567,8 +568,8 @@ FsRtlPrivateLock(IN PFILE_LOCK FileLock,
                 return FALSE;
             }
             DPRINT("Adding shared lock %wZ\n", &FileObject->FileName);
-            NewSharedRange->Start = ToInsert.Exclusive.FileLock.StartingByte;
-            NewSharedRange->End = ToInsert.Exclusive.FileLock.EndingByte;
+            NewSharedRange->Start = *FileOffset;
+            NewSharedRange->End.QuadPart = FileOffset->QuadPart + Length->QuadPart;
             NewSharedRange->Key = Key;
             NewSharedRange->ProcessId = ToInsert.Exclusive.FileLock.ProcessId;
             InsertTailList(&LockInfo->SharedLocks, &NewSharedRange->Entry);
@@ -612,7 +613,7 @@ FsRtlPrivateLock(IN PFILE_LOCK FileLock,
     }
     else
     {
-        DPRINT("Inserted new lock %wZ %08x%08x %08x%08x exclusive %d\n",
+        DPRINT("Inserted new lock %wZ %08x%08x %08x%08x exclusive %u\n",
                &FileObject->FileName,
                Conflict->Exclusive.FileLock.StartingByte.HighPart,
                Conflict->Exclusive.FileLock.StartingByte.LowPart,
@@ -622,7 +623,7 @@ FsRtlPrivateLock(IN PFILE_LOCK FileLock,
         if (!ExclusiveLock)
         {
             NewSharedRange = 
-                ExAllocatePoolWithTag(NonPagedPool, sizeof(*NewSharedRange), 'FSRA');
+                ExAllocatePoolWithTag(NonPagedPool, sizeof(*NewSharedRange), TAG_RANGE);
             if (!NewSharedRange)
             {
                 IoStatus->Status = STATUS_NO_MEMORY;
@@ -639,10 +640,10 @@ FsRtlPrivateLock(IN PFILE_LOCK FileLock,
                 return FALSE;
             }
             DPRINT("Adding shared lock %wZ\n", &FileObject->FileName);
-            NewSharedRange->Start = ToInsert.Exclusive.FileLock.StartingByte;
-            NewSharedRange->End = ToInsert.Exclusive.FileLock.EndingByte;
+            NewSharedRange->Start = *FileOffset;
+            NewSharedRange->End.QuadPart = FileOffset->QuadPart + Length->QuadPart;
             NewSharedRange->Key = Key;
-            NewSharedRange->ProcessId = ToInsert.Exclusive.FileLock.ProcessId;
+            NewSharedRange->ProcessId = Process;
             InsertTailList(&LockInfo->SharedLocks, &NewSharedRange->Entry);
         }
         
@@ -738,7 +739,7 @@ FsRtlCheckLockForWriteAccess(IN PFILE_LOCK FileLock,
         DPRINT("CheckLockForWriteAccess(%wZ) => TRUE\n", &IoStack->FileObject->FileName);
         return TRUE;
     }
-    Result = Process->UniqueProcessId == Found->Exclusive.FileLock.ProcessId;
+    Result = Process == Found->Exclusive.FileLock.ProcessId;
     DPRINT("CheckLockForWriteAccess(%wZ) => %s\n", &IoStack->FileObject->FileName, Result ? "TRUE" : "FALSE");
     return Result;
 }
@@ -774,7 +775,7 @@ FsRtlFastCheckLockForRead(IN PFILE_LOCK FileLock,
          &ToFind);
     if (!Found || !Found->Exclusive.FileLock.ExclusiveLock) return TRUE;
     return Found->Exclusive.FileLock.Key == Key && 
-        Found->Exclusive.FileLock.ProcessId == EProcess->UniqueProcessId;
+        Found->Exclusive.FileLock.ProcessId == EProcess;
 }
 
 /*
@@ -815,7 +816,7 @@ FsRtlFastCheckLockForWrite(IN PFILE_LOCK FileLock,
         return TRUE;
     }
     Result = Found->Exclusive.FileLock.Key == Key && 
-        Found->Exclusive.FileLock.ProcessId == EProcess->UniqueProcessId;
+        Found->Exclusive.FileLock.ProcessId == EProcess;
     DPRINT("CheckForWrite(%wZ) => %s\n", &FileObject->FileName, Result ? "TRUE" : "FALSE");
     return Result;
 }
@@ -857,14 +858,17 @@ FsRtlFastUnlockSingle(IN PFILE_LOCK FileLock,
     Find.Exclusive.FileLock.StartingByte = *FileOffset;
     Find.Exclusive.FileLock.EndingByte.QuadPart = 
         FileOffset->QuadPart + Length->QuadPart;
-    ASSERT(InternalInfo);
+    if (!InternalInfo) {
+        DPRINT("File not previously locked (ever)\n");
+        return STATUS_RANGE_NOT_LOCKED;
+    }
     Entry = RtlLookupElementGenericTable(&InternalInfo->RangeTable, &Find);
     if (!Entry) {
         DPRINT("Range not locked %wZ\n", &FileObject->FileName);
         return STATUS_RANGE_NOT_LOCKED;
     }
 
-    DPRINT("Found lock entry: Exclusive %d %08x%08x:%08x%08x %wZ\n",
+    DPRINT("Found lock entry: Exclusive %u %08x%08x:%08x%08x %wZ\n",
            Entry->Exclusive.FileLock.ExclusiveLock,
            Entry->Exclusive.FileLock.StartingByte.HighPart,
            Entry->Exclusive.FileLock.StartingByte.LowPart,
@@ -875,7 +879,7 @@ FsRtlFastUnlockSingle(IN PFILE_LOCK FileLock,
     if (Entry->Exclusive.FileLock.ExclusiveLock)
     {
         if (Entry->Exclusive.FileLock.Key != Key ||
-            Entry->Exclusive.FileLock.ProcessId != Process->UniqueProcessId ||
+            Entry->Exclusive.FileLock.ProcessId != Process ||
             Entry->Exclusive.FileLock.StartingByte.QuadPart != FileOffset->QuadPart ||
             Entry->Exclusive.FileLock.EndingByte.QuadPart != 
             FileOffset->QuadPart + Length->QuadPart)
@@ -903,7 +907,7 @@ FsRtlFastUnlockSingle(IN PFILE_LOCK FileLock,
             if (SharedRange->Start.QuadPart == FileOffset->QuadPart &&
                 SharedRange->End.QuadPart == FileOffset->QuadPart + Length->QuadPart &&
                 SharedRange->Key == Key &&
-                SharedRange->ProcessId == Process->UniqueProcessId)
+                SharedRange->ProcessId == Process)
             {
                 FoundShared = TRUE;
                 DPRINT("Found shared element to delete %wZ Start %08x%08x End %08x%08x Key %x\n",
@@ -918,14 +922,9 @@ FsRtlFastUnlockSingle(IN PFILE_LOCK FileLock,
         }
         if (FoundShared)
         {
-            PLIST_ENTRY SharedRangeEntry;
-            PLOCK_SHARED_RANGE WatchSharedRange;
-            COMBINED_LOCK_ELEMENT RemadeElement;
-            Find.Exclusive.FileLock.StartingByte = SharedRange->Start;
-            Find.Exclusive.FileLock.EndingByte = SharedRange->End;
-            SharedEntry = SharedRange->Entry.Flink;
+            /* Remove the found range from the shared range lists */
             RemoveEntryList(&SharedRange->Entry);
-            ExFreePool(SharedRange);
+            ExFreePoolWithTag(SharedRange, TAG_RANGE);
             /* We need to rebuild the list of shared ranges. */
             DPRINT("Removing the lock entry %wZ (%08x%08x:%08x%08x)\n", 
                    &FileObject->FileName, 
@@ -933,19 +932,25 @@ FsRtlFastUnlockSingle(IN PFILE_LOCK FileLock,
                    Entry->Exclusive.FileLock.StartingByte.LowPart,
                    Entry->Exclusive.FileLock.EndingByte.HighPart, 
                    Entry->Exclusive.FileLock.EndingByte.LowPart);
-            /* Copy */
-            RemadeElement = *Entry;
-            RtlDeleteElementGenericTable(&InternalInfo->RangeTable, Entry);
+               
+            /* Remember what was in there and remove it from the table */
+            Find = *Entry;
+            RtlDeleteElementGenericTable(&InternalInfo->RangeTable, &Find);
             /* Put shared locks back in place */
-            for (SharedRangeEntry = InternalInfo->SharedLocks.Flink;
-                 SharedRangeEntry != &InternalInfo->SharedLocks;
-                 SharedRangeEntry = SharedRangeEntry->Flink)
+            for (SharedEntry = InternalInfo->SharedLocks.Flink;
+                 SharedEntry != &InternalInfo->SharedLocks;
+                 SharedEntry = SharedEntry->Flink)
             {
                 COMBINED_LOCK_ELEMENT LockElement;
-                WatchSharedRange = CONTAINING_RECORD(SharedRangeEntry, LOCK_SHARED_RANGE, Entry);
-                LockElement.Exclusive.FileLock.StartingByte = WatchSharedRange->Start;
-                LockElement.Exclusive.FileLock.EndingByte = WatchSharedRange->End;
-                if (LockCompare(&InternalInfo->RangeTable, &RemadeElement, &LockElement) != GenericEqual)
+                SharedRange = CONTAINING_RECORD(SharedEntry, LOCK_SHARED_RANGE, Entry);
+                LockElement.Exclusive.FileLock.FileObject = FileObject;
+                LockElement.Exclusive.FileLock.StartingByte = SharedRange->Start;
+                LockElement.Exclusive.FileLock.EndingByte = SharedRange->End;
+                LockElement.Exclusive.FileLock.ProcessId = SharedRange->ProcessId;
+                LockElement.Exclusive.FileLock.Key = SharedRange->Key;
+                LockElement.Exclusive.FileLock.ExclusiveLock = FALSE;
+                
+                if (LockCompare(&InternalInfo->RangeTable, &Find, &LockElement) != GenericEqual)
                 {
                     DPRINT("Skipping range %08x%08x:%08x%08x\n",
                            LockElement.Exclusive.FileLock.StartingByte.HighPart,
@@ -959,10 +964,7 @@ FsRtlFastUnlockSingle(IN PFILE_LOCK FileLock,
                        LockElement.Exclusive.FileLock.StartingByte.LowPart,
                        LockElement.Exclusive.FileLock.EndingByte.HighPart,
                        LockElement.Exclusive.FileLock.EndingByte.LowPart);
-                RtlZeroMemory(&RemadeElement, sizeof(RemadeElement));
-                RemadeElement.Exclusive.FileLock.StartingByte = WatchSharedRange->Start;
-                RemadeElement.Exclusive.FileLock.EndingByte = WatchSharedRange->End;
-                FsRtlpRebuildSharedLockRange(FileLock, InternalInfo, &RemadeElement);
+                FsRtlpRebuildSharedLockRange(FileLock, InternalInfo, &LockElement);
             }
         }
         else
@@ -970,7 +972,8 @@ FsRtlFastUnlockSingle(IN PFILE_LOCK FileLock,
             return STATUS_RANGE_NOT_LOCKED;
         }
     }
-    
+
+#ifndef NDEBUG    
     DPRINT("Lock still has:\n");
     for (SharedEntry = InternalInfo->SharedLocks.Flink;
          SharedEntry != &InternalInfo->SharedLocks;
@@ -985,6 +988,7 @@ FsRtlFastUnlockSingle(IN PFILE_LOCK FileLock,
                SharedRange->End.LowPart,
                SharedRange->Key);
     }
+#endif
     
     // this is definitely the thing we want
     InternalInfo->Generation++;
@@ -1006,7 +1010,7 @@ FsRtlFastUnlockSingle(IN PFILE_LOCK FileLock,
         // we looked, but can't guarantee that it won't just be re-queued
         // because somebody else snatched part of the range in a new thread.
         DPRINT("Locking another IRP %p for %p %wZ\n", 
-               &FileObject->FileName, FileLock, NextMatchingLockIrp);
+               NextMatchingLockIrp, FileLock, &FileObject->FileName);
         FsRtlProcessFileLock(InternalInfo->BelongsTo, NextMatchingLockIrp, NULL);
     }
     
@@ -1040,7 +1044,7 @@ FsRtlFastUnlockAll(IN PFILE_LOCK FileLock,
         PLOCK_SHARED_RANGE Range = CONTAINING_RECORD(ListEntry, LOCK_SHARED_RANGE, Entry);
         Length.QuadPart = Range->End.QuadPart - Range->Start.QuadPart;
         ListEntry = ListEntry->Flink;
-        if (Range->ProcessId != Process->UniqueProcessId)
+        if (Range->ProcessId != Process)
             continue;
         FsRtlFastUnlockSingle
             (FileLock,
@@ -1101,7 +1105,7 @@ FsRtlFastUnlockAllByKey(IN PFILE_LOCK FileLock,
         LARGE_INTEGER Length;
         Length.QuadPart = Range->End.QuadPart - Range->Start.QuadPart;
         ListEntry = ListEntry->Flink;
-        if (Range->ProcessId != Process->UniqueProcessId ||
+        if (Range->ProcessId != Process ||
             Range->Key != Key)
             continue;
         FsRtlFastUnlockSingle
@@ -1124,7 +1128,7 @@ FsRtlFastUnlockAllByKey(IN PFILE_LOCK FileLock,
             Entry->Exclusive.FileLock.EndingByte.QuadPart - 
             Entry->Exclusive.FileLock.StartingByte.QuadPart;
         if (Entry->Exclusive.FileLock.Key == Key && 
-            Entry->Exclusive.FileLock.ProcessId == Process->UniqueProcessId)
+            Entry->Exclusive.FileLock.ProcessId == Process)
         {
             FsRtlFastUnlockSingle
                 (FileLock, 
@@ -1286,8 +1290,8 @@ FsRtlUninitializeFileLock(IN PFILE_LOCK FileLock)
         {
             SharedRange = CONTAINING_RECORD(SharedEntry, LOCK_SHARED_RANGE, Entry);
             SharedEntry = SharedEntry->Flink;
-            RemoveEntryList(SharedEntry);
-            ExFreePool(SharedRange);
+            RemoveEntryList(&SharedRange->Entry);
+            ExFreePoolWithTag(SharedRange, TAG_RANGE);
         }
         while ((Entry = RtlGetElementGenericTable(&InternalInfo->RangeTable, 0)) != NULL)
         {
@@ -1297,7 +1301,7 @@ FsRtlUninitializeFileLock(IN PFILE_LOCK FileLock)
         {
             FsRtlProcessFileLock(FileLock, Irp, NULL);
         }
-        ExFreePoolWithTag(InternalInfo, 'FLCK');
+        ExFreePoolWithTag(InternalInfo, TAG_FLOCK);
         FileLock->LockInformation = NULL;
     }
 }