mirror of
https://github.com/reactos/reactos.git
synced 2025-05-30 14:39:46 +00:00
[NTOSKRNL] Stub page file extension support
This commit is contained in:
parent
11b7619a71
commit
5bd938bd24
1 changed files with 64 additions and 0 deletions
|
@ -571,9 +571,12 @@ NtCreatePagingFile(IN PUNICODE_STRING FileName,
|
||||||
/* If we failed, relax a bit constraints, someone may be already holding the
|
/* If we failed, relax a bit constraints, someone may be already holding the
|
||||||
* the file, so share write, don't attempt to replace and don't delete on close
|
* the file, so share write, don't attempt to replace and don't delete on close
|
||||||
* (basically, don't do anything conflicting)
|
* (basically, don't do anything conflicting)
|
||||||
|
* This can happen if the caller attempts to extend a page file.
|
||||||
*/
|
*/
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
|
ULONG i;
|
||||||
|
|
||||||
Status = IoCreateFile(&FileHandle,
|
Status = IoCreateFile(&FileHandle,
|
||||||
SYNCHRONIZE | FILE_WRITE_DATA,
|
SYNCHRONIZE | FILE_WRITE_DATA,
|
||||||
&ObjectAttributes,
|
&ObjectAttributes,
|
||||||
|
@ -588,6 +591,67 @@ NtCreatePagingFile(IN PUNICODE_STRING FileName,
|
||||||
CreateFileTypeNone,
|
CreateFileTypeNone,
|
||||||
NULL,
|
NULL,
|
||||||
SL_OPEN_PAGING_FILE | IO_NO_PARAMETER_CHECKING);
|
SL_OPEN_PAGING_FILE | IO_NO_PARAMETER_CHECKING);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
ExFreePoolWithTag(Dacl, 'lcaD');
|
||||||
|
ExFreePoolWithTag(Buffer, TAG_MM);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We opened it! Check we are that "someone" ;-)
|
||||||
|
* First, get the opened file object.
|
||||||
|
*/
|
||||||
|
Status = ObReferenceObjectByHandle(FileHandle,
|
||||||
|
FILE_READ_DATA | FILE_WRITE_DATA,
|
||||||
|
IoFileObjectType,
|
||||||
|
KernelMode,
|
||||||
|
(PVOID*)&FileObject,
|
||||||
|
NULL);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
ZwClose(FileHandle);
|
||||||
|
ExFreePoolWithTag(Dacl, 'lcaD');
|
||||||
|
ExFreePoolWithTag(Buffer, TAG_MM);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find if it matches a previous page file */
|
||||||
|
PagingFile = NULL;
|
||||||
|
if (MmNumberOfPagingFiles > 0)
|
||||||
|
{
|
||||||
|
i = 0;
|
||||||
|
|
||||||
|
while (MmPagingFile[i]->FileObject->SectionObjectPointer != FileObject->SectionObjectPointer)
|
||||||
|
{
|
||||||
|
++i;
|
||||||
|
if (i >= MmNumberOfPagingFiles)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is the matching page file */
|
||||||
|
PagingFile = MmPagingFile[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we didn't find the page file, fail */
|
||||||
|
if (PagingFile == NULL)
|
||||||
|
{
|
||||||
|
ObDereferenceObject(FileObject);
|
||||||
|
ZwClose(FileHandle);
|
||||||
|
ExFreePoolWithTag(Dacl, 'lcaD');
|
||||||
|
ExFreePoolWithTag(Buffer, TAG_MM);
|
||||||
|
return STATUS_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME: implement parameters checking and page file extension */
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
|
||||||
|
ObDereferenceObject(FileObject);
|
||||||
|
ZwClose(FileHandle);
|
||||||
|
ExFreePoolWithTag(Dacl, 'lcaD');
|
||||||
|
ExFreePoolWithTag(Buffer, TAG_MM);
|
||||||
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
|
|
Loading…
Reference in a new issue