[KERNEL32] Check NtQueryInformationFile succeed before using its return. Also fix coding style

CID 512966
This commit is contained in:
Pierre Schweitzer 2017-10-23 12:36:43 +02:00
parent 361664d57f
commit 19f1cd78c1

View file

@ -325,70 +325,90 @@ SetFilePointer(HANDLE hFile,
BOOL BOOL
WINAPI WINAPI
SetFilePointerEx(HANDLE hFile, SetFilePointerEx(HANDLE hFile,
LARGE_INTEGER liDistanceToMove, LARGE_INTEGER liDistanceToMove,
PLARGE_INTEGER lpNewFilePointer, PLARGE_INTEGER lpNewFilePointer,
DWORD dwMoveMethod) DWORD dwMoveMethod)
{ {
FILE_POSITION_INFORMATION FilePosition; NTSTATUS Status;
FILE_STANDARD_INFORMATION FileStandard; IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS errCode; FILE_POSITION_INFORMATION FilePosition;
IO_STATUS_BLOCK IoStatusBlock; FILE_STANDARD_INFORMATION FileStandard;
if(IsConsoleHandle(hFile)) if (IsConsoleHandle(hFile))
{ {
SetLastError(ERROR_INVALID_HANDLE); BaseSetLastNTError(STATUS_INVALID_HANDLE);
return FALSE; return FALSE;
} }
switch(dwMoveMethod) switch (dwMoveMethod)
{ {
case FILE_CURRENT: case FILE_CURRENT:
NtQueryInformationFile(hFile, {
&IoStatusBlock, Status = NtQueryInformationFile(hFile, &IoStatusBlock,
&FilePosition, &FilePosition,
sizeof(FILE_POSITION_INFORMATION), sizeof(FILE_POSITION_INFORMATION),
FilePositionInformation); FilePositionInformation);
FilePosition.CurrentByteOffset.QuadPart += liDistanceToMove.QuadPart; if (!NT_SUCCESS(Status))
break; {
case FILE_END: BaseSetLastNTError(Status);
NtQueryInformationFile(hFile, return FALSE;
&IoStatusBlock, }
&FileStandard,
sizeof(FILE_STANDARD_INFORMATION),
FileStandardInformation);
FilePosition.CurrentByteOffset.QuadPart =
FileStandard.EndOfFile.QuadPart + liDistanceToMove.QuadPart;
break;
case FILE_BEGIN:
FilePosition.CurrentByteOffset.QuadPart = liDistanceToMove.QuadPart;
break;
default:
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
if(FilePosition.CurrentByteOffset.QuadPart < 0) FilePosition.CurrentByteOffset.QuadPart += liDistanceToMove.QuadPart;
{ break;
SetLastError(ERROR_NEGATIVE_SEEK); }
return FALSE;
}
errCode = NtSetInformationFile(hFile, case FILE_END:
&IoStatusBlock, {
&FilePosition, Status = NtQueryInformationFile(hFile, &IoStatusBlock,
sizeof(FILE_POSITION_INFORMATION), &FileStandard,
FilePositionInformation); sizeof(FILE_STANDARD_INFORMATION),
if (!NT_SUCCESS(errCode)) FileStandardInformation);
{ if (!NT_SUCCESS(Status))
BaseSetLastNTError(errCode); {
return FALSE; BaseSetLastNTError(Status);
} return FALSE;
}
if (lpNewFilePointer) FilePosition.CurrentByteOffset.QuadPart = FileStandard.EndOfFile.QuadPart +
{ liDistanceToMove.QuadPart;
break;
}
case FILE_BEGIN:
{
FilePosition.CurrentByteOffset.QuadPart = liDistanceToMove.QuadPart;
break;
}
default:
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
}
if (FilePosition.CurrentByteOffset.QuadPart < 0)
{
SetLastError(ERROR_NEGATIVE_SEEK);
return FALSE;
}
Status = NtSetInformationFile(hFile, &IoStatusBlock, &FilePosition,
sizeof(FILE_POSITION_INFORMATION),
FilePositionInformation);
if (!NT_SUCCESS(Status))
{
BaseSetLastNTError(Status);
return FALSE;
}
if (lpNewFilePointer != NULL)
{
*lpNewFilePointer = FilePosition.CurrentByteOffset; *lpNewFilePointer = FilePosition.CurrentByteOffset;
} }
return TRUE;
return TRUE;
} }