mirror of
https://github.com/reactos/reactos.git
synced 2024-10-05 08:54:40 +00:00
[NTOSKRNL]
* Break down the checks as suggested by Alex. Brought to you by David Quintana. svn path=/trunk/; revision=60045
This commit is contained in:
parent
eb435bcc01
commit
a1dd5cf574
|
@ -1740,24 +1740,59 @@ IoCreateFile(OUT PHANDLE FileHandle,
|
|||
if ((AccessMode != KernelMode) || (Options & IO_CHECK_CREATE_PARAMETERS))
|
||||
{
|
||||
/* Validate parameters */
|
||||
if ((FileAttributes & ~FILE_ATTRIBUTE_VALID_FLAGS) ||
|
||||
if (FileAttributes & ~FILE_ATTRIBUTE_VALID_FLAGS)
|
||||
{
|
||||
DPRINT1("File Create 'FileAttributes' Parameter contains invalid flags!\n");
|
||||
ExFreePool(OpenPacket);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
(ShareAccess & ~FILE_SHARE_VALID_FLAGS) ||
|
||||
if (ShareAccess & ~FILE_SHARE_VALID_FLAGS)
|
||||
{
|
||||
DPRINT1("File Create 'ShareAccess' Parameter contains invalid flags!\n");
|
||||
ExFreePool(OpenPacket);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
(Disposition > FILE_MAXIMUM_DISPOSITION) ||
|
||||
if (Disposition > FILE_MAXIMUM_DISPOSITION)
|
||||
{
|
||||
DPRINT1("File Create 'Disposition' Parameter is out of range!\n");
|
||||
ExFreePool(OpenPacket);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
(CreateOptions & ~FILE_VALID_OPTION_FLAGS) ||
|
||||
if (CreateOptions & ~FILE_VALID_OPTION_FLAGS)
|
||||
{
|
||||
DPRINT1("File Create 'CreateOptions' Prameter contains invalid flags!\n");
|
||||
ExFreePool(OpenPacket);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
((CreateOptions & (FILE_SYNCHRONOUS_IO_ALERT | FILE_SYNCHRONOUS_IO_NONALERT)) &&
|
||||
(!(DesiredAccess & SYNCHRONIZE))) ||
|
||||
if ((CreateOptions & (FILE_SYNCHRONOUS_IO_ALERT | FILE_SYNCHRONOUS_IO_NONALERT)) &&
|
||||
(!(DesiredAccess & SYNCHRONIZE)))
|
||||
{
|
||||
DPRINT1("File Create 'CreateOptions' Prameter FILE_SYNCHRONOUS_IO_* requested, but 'DesiredAccess' does not have SYNCHRONIZE!\n");
|
||||
ExFreePool(OpenPacket);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
((CreateOptions & FILE_DELETE_ON_CLOSE) && (!(DesiredAccess & DELETE))) ||
|
||||
if ((CreateOptions & FILE_DELETE_ON_CLOSE) && (!(DesiredAccess & DELETE)))
|
||||
{
|
||||
DPRINT1("File Create 'CreateOptions' Prameter FILE_DELETE_ON_CLOSE requested, but 'DesiredAccess' does not have DELETE!\n");
|
||||
ExFreePool(OpenPacket);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
((CreateOptions & (FILE_SYNCHRONOUS_IO_NONALERT | FILE_SYNCHRONOUS_IO_ALERT)) ==
|
||||
(FILE_SYNCHRONOUS_IO_NONALERT | FILE_SYNCHRONOUS_IO_ALERT)) ||
|
||||
if ((CreateOptions & (FILE_SYNCHRONOUS_IO_NONALERT | FILE_SYNCHRONOUS_IO_ALERT)) ==
|
||||
(FILE_SYNCHRONOUS_IO_NONALERT | FILE_SYNCHRONOUS_IO_ALERT))
|
||||
{
|
||||
DPRINT1("File Create 'FileAttributes' Prameter both FILE_SYNCHRONOUS_IO_NONALERT and FILE_SYNCHRONOUS_IO_ALERT specified!\n");
|
||||
ExFreePool(OpenPacket);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
((CreateOptions & FILE_DIRECTORY_FILE) && !(CreateOptions & FILE_NON_DIRECTORY_FILE) &&
|
||||
((CreateOptions & ~(FILE_DIRECTORY_FILE |
|
||||
if ((CreateOptions & FILE_DIRECTORY_FILE) && !(CreateOptions & FILE_NON_DIRECTORY_FILE) &&
|
||||
(CreateOptions & ~(FILE_DIRECTORY_FILE |
|
||||
FILE_SYNCHRONOUS_IO_ALERT |
|
||||
FILE_SYNCHRONOUS_IO_NONALERT |
|
||||
FILE_WRITE_THROUGH |
|
||||
|
@ -1767,18 +1802,31 @@ IoCreateFile(OUT PHANDLE FileHandle,
|
|||
FILE_OPEN_FOR_FREE_SPACE_QUERY |
|
||||
FILE_OPEN_BY_FILE_ID |
|
||||
FILE_NO_COMPRESSION |
|
||||
FILE_OPEN_REPARSE_POINT)) ||
|
||||
((Disposition != FILE_CREATE) && (Disposition != FILE_OPEN) && (Disposition != FILE_OPEN_IF)))) ||
|
||||
|
||||
((CreateOptions & FILE_COMPLETE_IF_OPLOCKED) && (CreateOptions & FILE_RESERVE_OPFILTER)) ||
|
||||
|
||||
((CreateOptions & FILE_NO_INTERMEDIATE_BUFFERING) && (DesiredAccess & FILE_APPEND_DATA)))
|
||||
FILE_OPEN_REPARSE_POINT)))
|
||||
{
|
||||
/*
|
||||
* Parameter failure. We'll be as unspecific as NT as to
|
||||
* why this happened though, to make debugging a pain!
|
||||
*/
|
||||
DPRINT1("File Create Parameter Failure!\n");
|
||||
DPRINT1("File Create 'CreateOptions' Parameter has flags incompatible with FILE_DIRECTORY_FILE!\n");
|
||||
ExFreePool(OpenPacket);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if ((CreateOptions & FILE_DIRECTORY_FILE) && !(CreateOptions & FILE_NON_DIRECTORY_FILE) &&
|
||||
(Disposition != FILE_CREATE) && (Disposition != FILE_OPEN) && (Disposition != FILE_OPEN_IF))
|
||||
{
|
||||
DPRINT1("File Create 'CreateOptions' Parameter FILE_DIRECTORY_FILE requested, but 'Disposition' is not FILE_CREATE/FILE_OPEN/FILE_OPEN_IF!\n");
|
||||
ExFreePool(OpenPacket);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if ((CreateOptions & FILE_COMPLETE_IF_OPLOCKED) && (CreateOptions & FILE_RESERVE_OPFILTER))
|
||||
{
|
||||
DPRINT1("File Create 'CreateOptions' Parameter both FILE_COMPLETE_IF_OPLOCKED and FILE_RESERVE_OPFILTER specified!\n");
|
||||
ExFreePool(OpenPacket);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if ((CreateOptions & FILE_NO_INTERMEDIATE_BUFFERING) && (DesiredAccess & FILE_APPEND_DATA))
|
||||
{
|
||||
DPRINT1("File Create 'CreateOptions' Prameter FILE_NO_INTERMEDIATE_BUFFERING requested, but 'DesiredAccess' FILE_APPEND_DATA requires it!\n");
|
||||
ExFreePool(OpenPacket);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue