[BLUE] Reformat and add missing success checks + DPRINTs on failure

This commit is contained in:
Timo Kreuzer 2018-07-01 10:24:22 +02:00
parent 64f46045af
commit 741c3c0022

View file

@ -33,25 +33,34 @@ ScrLoadFontTable(
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
FontBitfield = (PUCHAR)ExAllocatePoolWithTag(NonPagedPool, 2048, TAG_BLUE); FontBitfield = (PUCHAR)ExAllocatePoolWithTag(NonPagedPool, 2048, TAG_BLUE);
if (FontBitfield) if (FontBitfield == NULL)
{ {
/* open bit plane for font table access */ DPRINT1("ExAllocatePoolWithTag failed\n");
OpenBitPlane(); return;
/* get pointer to video memory */
BaseAddress.QuadPart = BITPLANE_BASE;
Bitplane = (PUCHAR)MmMapIoSpace(BaseAddress, 0xFFFF, MmNonCached);
Status = ExtractFont(CodePage, FontBitfield);
if (NT_SUCCESS(Status))
LoadFont(Bitplane, FontBitfield);
MmUnmapIoSpace(Bitplane, 0xFFFF);
ExFreePool(FontBitfield);
/* close bit plane */
CloseBitPlane();
} }
/* open bit plane for font table access */
OpenBitPlane();
/* get pointer to video memory */
BaseAddress.QuadPart = BITPLANE_BASE;
Bitplane = (PUCHAR)MmMapIoSpace(BaseAddress, 0xFFFF, MmNonCached);
Status = ExtractFont(CodePage, FontBitfield);
if (NT_SUCCESS(Status))
{
LoadFont(Bitplane, FontBitfield);
}
else
{
DPRINT1("ExtractFont failed with Status 0x%lx\n", Status);
}
MmUnmapIoSpace(Bitplane, 0xFFFF);
ExFreePool(FontBitfield);
/* close bit plane */
CloseBitPlane();
} }
/* PRIVATE FUNCTIONS *********************************************************/ /* PRIVATE FUNCTIONS *********************************************************/
@ -93,7 +102,10 @@ ExtractFont(
&ObjectAttributes); &ObjectAttributes);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
return(Status); {
DPRINT1("ZwOpenSymbolicLinkObject failed with Status 0x%lx\n", Status);
return Status;
}
SourceName.Length = 0; SourceName.Length = 0;
SourceName.MaximumLength = MAX_PATH * sizeof(WCHAR); SourceName.MaximumLength = MAX_PATH * sizeof(WCHAR);
@ -104,7 +116,19 @@ ExtractFont(
NULL); NULL);
ZwClose(Handle); ZwClose(Handle);
if (!NT_SUCCESS(Status))
{
DPRINT1("ZwQuerySymbolicLinkObject failed with Status 0x%lx\n", Status);
return Status;
}
Status = RtlAppendUnicodeToString(&SourceName, L"\\vgafonts.cab"); Status = RtlAppendUnicodeToString(&SourceName, L"\\vgafonts.cab");
if (!NT_SUCCESS(Status))
{
DPRINT1("RtlAppendUnicodeToString failed with Status 0x%lx\n", Status);
return Status;
}
InitializeObjectAttributes(&ObjectAttributes, InitializeObjectAttributes(&ObjectAttributes,
&SourceName, &SourceName,
OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
@ -125,109 +149,111 @@ ExtractFont(
ByteOffset.LowPart = ByteOffset.HighPart = 0; ByteOffset.LowPart = ByteOffset.HighPart = 0;
if (NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{
DPRINT1("Error: Cannot open vgafonts.cab (0x%lx)\n", Status);
return Status;
}
Status = ZwReadFile(Handle,
NULL,
NULL,
NULL,
&IoStatusBlock,
&CabFileHeader,
sizeof(CabFileHeader),
&ByteOffset,
NULL);
if (!NT_SUCCESS(Status))
{
DPRINT1("Error: Cannot read from file (0x%lx)\n", Status);
goto Exit;
}
if (CabFileHeader.Signature != CAB_SIGNATURE)
{
DPRINT1("Error: CAB signature is missing!\n");
Status = STATUS_UNSUCCESSFUL;
goto Exit;
}
// We have a valid CAB file!
// Read the file table now and decrement the file count on every file. When it's zero, we read the complete table.
ByteOffset.LowPart = CabFileHeader.FileTableOffset;
while (CabFileHeader.FileCount)
{ {
Status = ZwReadFile(Handle, Status = ZwReadFile(Handle,
NULL, NULL,
NULL, NULL,
NULL, NULL,
&IoStatusBlock, &IoStatusBlock,
&CabFileHeader, &CabFile,
sizeof(CabFileHeader), sizeof(CabFile),
&ByteOffset, &ByteOffset,
NULL); NULL);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
if (CabFileHeader.Signature == CAB_SIGNATURE) ByteOffset.LowPart += sizeof(CabFile);
// We assume here that the file name is max. 19 characters (+ 1 NULL character) long.
// This should be enough for our purpose.
Status = ZwReadFile(Handle,
NULL,
NULL,
NULL,
&IoStatusBlock,
FileName,
sizeof(FileName),
&ByteOffset,
NULL);
if (NT_SUCCESS(Status))
{ {
// We have a valid CAB file! if (!bFoundFile)
// Read the file table now and decrement the file count on every file. When it's zero, we read the complete table.
ByteOffset.LowPart = CabFileHeader.FileTableOffset;
while (CabFileHeader.FileCount)
{ {
Status = ZwReadFile(Handle, Status = RtlCharToInteger(FileName, 0, &ReadCP);
NULL, if (NT_SUCCESS(Status) && ReadCP == CodePage)
NULL,
NULL,
&IoStatusBlock,
&CabFile,
sizeof(CabFile),
&ByteOffset,
NULL);
if (NT_SUCCESS(Status))
{ {
ByteOffset.LowPart += sizeof(CabFile); // We got the correct file.
// Save the offset and loop through the rest of the file table to find the position, where the actual data starts.
// We assume here that the file name is max. 19 characters (+ 1 NULL character) long. CabFileOffset = CabFile.FileOffset;
// This should be enough for our purpose. bFoundFile = TRUE;
Status = ZwReadFile(Handle,
NULL,
NULL,
NULL,
&IoStatusBlock,
FileName,
sizeof(FileName),
&ByteOffset,
NULL);
if (NT_SUCCESS(Status))
{
if (!bFoundFile)
{
Status = RtlCharToInteger(FileName, 0, &ReadCP);
if (NT_SUCCESS(Status) && ReadCP == CodePage)
{
// We got the correct file.
// Save the offset and loop through the rest of the file table to find the position, where the actual data starts.
CabFileOffset = CabFile.FileOffset;
bFoundFile = TRUE;
}
}
ByteOffset.LowPart += strlen(FileName) + 1;
}
} }
CabFileHeader.FileCount--;
} }
// 8 = Size of a CFFOLDER structure (see cabman). As we don't need the values of that structure, just increase the offset here. ByteOffset.LowPart += strlen(FileName) + 1;
ByteOffset.LowPart += 8;
ByteOffset.LowPart += CabFileOffset;
// ByteOffset now contains the offset of the actual data, so we can read the RAW font
Status = ZwReadFile(Handle,
NULL,
NULL,
NULL,
&IoStatusBlock,
FontBitField,
2048,
&ByteOffset,
NULL);
ZwClose(Handle);
return STATUS_SUCCESS;
}
else
{
DPRINT1("Error: CAB signature is missing!\n");
Status = STATUS_UNSUCCESSFUL;
} }
} }
else
DPRINT1("Error: Cannot read from file\n");
ZwClose(Handle); CabFileHeader.FileCount--;
return Status;
} }
else
// 8 = Size of a CFFOLDER structure (see cabman). As we don't need the values of that structure, just increase the offset here.
ByteOffset.LowPart += 8;
ByteOffset.LowPart += CabFileOffset;
// ByteOffset now contains the offset of the actual data, so we can read the RAW font
Status = ZwReadFile(Handle,
NULL,
NULL,
NULL,
&IoStatusBlock,
FontBitField,
2048,
&ByteOffset,
NULL);
if (!NT_SUCCESS(Status))
{ {
DPRINT1("Error: Cannot open vgafonts.cab\n"); DPRINT1("ZwReadFile failed with Status 0x%lx\n", Status);
return Status;
} }
Exit:
ZwClose(Handle);
return Status;
} }
/* Font-load specific funcs */ /* Font-load specific funcs */