mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 18:15:11 +00:00
[BLUE] Reformat and add missing success checks + DPRINTs on failure
This commit is contained in:
parent
64f46045af
commit
741c3c0022
1 changed files with 124 additions and 98 deletions
|
@ -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 */
|
||||||
|
|
Loading…
Reference in a new issue