Index: ntoskrnl/mm/ARM3/vadnode.c =================================================================== --- ntoskrnl/mm/ARM3/vadnode.c (révision 70478) +++ ntoskrnl/mm/ARM3/vadnode.c (copie de travail) @@ -285,9 +285,36 @@ &Parent); if (Result == TableFoundNode) { - DPRINT1("Given address conflicts with existing node\n"); - KeReleaseGuardedMutex(&CurrentProcess->AddressCreationLock); - return STATUS_CONFLICTING_ADDRESSES; + PMMVAD Bit; + CurrentThread = PsGetCurrentThread(); + MiLockProcessWorkingSetUnsafe(CurrentProcess, CurrentThread); + Bit = MiLocateAddress((void*)StartingAddress); + if ((Bit->EndingVpn == EndingAddress >> PAGE_SHIFT) && (Bit->StartingVpn == StartingAddress >> PAGE_SHIFT)) { + DPRINT1("Return already allocated VAD\n"); + Vad = Bit; + MiUnlockProcessWorkingSetUnsafe(CurrentProcess, CurrentThread); + KeReleaseGuardedMutex(&CurrentProcess->AddressCreationLock); + return STATUS_SUCCESS; + } + else if (Bit->StartingVpn == StartingAddress >> PAGE_SHIFT){ + DPRINT1("Extend memory zone\n"); + Vad->StartingVpn = Bit->EndingVpn; + Vad->EndingVpn = EndingAddress >> PAGE_SHIFT; + ((PMMVAD_LONG)Vad)->u3.Secured.StartVpn = Vad->StartingVpn; + ((PMMVAD_LONG)Vad)->u3.Secured.EndVpn = Vad->EndingVpn; + StartingAddress= Vad->StartingVpn << PAGE_SHIFT; + EndingAddress = Vad->EndingVpn << PAGE_SHIFT; + MiInsertVad(Vad, &CurrentProcess->VadRoot); + MiUnlockProcessWorkingSetUnsafe(CurrentProcess, CurrentThread); + KeReleaseGuardedMutex(&CurrentProcess->AddressCreationLock); + return STATUS_SUCCESS; + } + else { + DPRINT1("Given address conflicts with existing node\n"); + MiUnlockProcessWorkingSetUnsafe(CurrentProcess, CurrentThread); + KeReleaseGuardedMutex(&CurrentProcess->AddressCreationLock); + return STATUS_CONFLICTING_ADDRESSES; + } } } @@ -864,7 +891,6 @@ } } } - /* All good, allow the change */ return STATUS_SUCCESS; }