Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenfont.c
Go to the documentation of this file.
00001 /* 00002 * PROJECT: ReactOS Setup Driver 00003 * LICENSE: GPL - See COPYING in the top level directory 00004 * FILE: drivers/setup/blue/font.c 00005 * PURPOSE: Loading specific fonts into VGA 00006 * PROGRAMMERS: Aleksey Bragin (aleksey@reactos.org) 00007 * Colin Finck (mail@colinfinck.de) 00008 * Christoph von Wittich (christoph_vw@reactos.org) 00009 */ 00010 00011 /* INCLUDES ***************************************************************/ 00012 00013 #include <ntddk.h> 00014 #include "blue.h" 00015 00016 #define NDEBUG 00017 #include <debug.h> 00018 00019 VOID OpenBitPlane(); 00020 VOID CloseBitPlane(); 00021 VOID LoadFont(PUCHAR Bitplane, PUCHAR FontBitfield); 00022 00023 /* FUNCTIONS ****************************************************************/ 00024 00025 VOID 00026 ScrLoadFontTable(UINT32 CodePage) 00027 { 00028 PHYSICAL_ADDRESS BaseAddress; 00029 PUCHAR Bitplane; 00030 PUCHAR FontBitfield = NULL; 00031 NTSTATUS Status = STATUS_SUCCESS; 00032 00033 FontBitfield = (PUCHAR) ExAllocatePoolWithTag(NonPagedPool, 2048, TAG_BLUE); 00034 if(FontBitfield) 00035 { 00036 /* open bit plane for font table access */ 00037 OpenBitPlane(); 00038 00039 /* get pointer to video memory */ 00040 BaseAddress.QuadPart = BITPLANE_BASE; 00041 Bitplane = (PUCHAR)MmMapIoSpace (BaseAddress, 0xFFFF, MmNonCached); 00042 00043 Status = ExtractFont(CodePage, FontBitfield); 00044 if (NT_SUCCESS(Status)) 00045 LoadFont(Bitplane, FontBitfield); 00046 00047 MmUnmapIoSpace(Bitplane, 0xFFFF); 00048 ExFreePool(FontBitfield); 00049 00050 /* close bit plane */ 00051 CloseBitPlane(); 00052 } 00053 } 00054 00055 /* PRIVATE FUNCTIONS *********************************************************/ 00056 00057 NTSTATUS ExtractFont(UINT32 CodePage, PUCHAR FontBitField) 00058 { 00059 BOOLEAN bFoundFile = FALSE; 00060 HANDLE Handle; 00061 NTSTATUS Status; 00062 CHAR FileName[20]; 00063 IO_STATUS_BLOCK IoStatusBlock; 00064 OBJECT_ATTRIBUTES ObjectAttributes; 00065 UNICODE_STRING LinkName; 00066 UNICODE_STRING SourceName; 00067 CFHEADER CabFileHeader; 00068 CFFILE CabFile; 00069 ULONG CabFileOffset = 0; 00070 LARGE_INTEGER ByteOffset; 00071 WCHAR SourceBuffer[MAX_PATH] = {L'\0'}; 00072 ULONG ReadCP; 00073 00074 if(KeGetCurrentIrql() != PASSIVE_LEVEL) 00075 return STATUS_INVALID_DEVICE_STATE; 00076 00077 RtlInitUnicodeString(&LinkName, 00078 L"\\SystemRoot"); 00079 00080 InitializeObjectAttributes(&ObjectAttributes, 00081 &LinkName, 00082 OBJ_CASE_INSENSITIVE, 00083 NULL, 00084 NULL); 00085 00086 Status = ZwOpenSymbolicLinkObject(&Handle, 00087 SYMBOLIC_LINK_ALL_ACCESS, 00088 &ObjectAttributes); 00089 00090 if (!NT_SUCCESS(Status)) 00091 return(Status); 00092 00093 SourceName.Length = 0; 00094 SourceName.MaximumLength = MAX_PATH * sizeof(WCHAR); 00095 SourceName.Buffer = SourceBuffer; 00096 00097 Status = ZwQuerySymbolicLinkObject(Handle, 00098 &SourceName, 00099 NULL); 00100 ZwClose(Handle); 00101 00102 Status = RtlAppendUnicodeToString(&SourceName, L"\\vgafonts.cab"); 00103 InitializeObjectAttributes(&ObjectAttributes, &SourceName, 00104 OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, 00105 NULL, NULL); 00106 00107 Status = ZwCreateFile(&Handle, 00108 GENERIC_READ, 00109 &ObjectAttributes, &IoStatusBlock, NULL, 00110 FILE_ATTRIBUTE_NORMAL, 00111 0, 00112 FILE_OPEN, 00113 FILE_SYNCHRONOUS_IO_NONALERT, 00114 NULL, 0); 00115 00116 ByteOffset.LowPart = ByteOffset.HighPart = 0; 00117 00118 if(NT_SUCCESS(Status)) 00119 { 00120 Status = ZwReadFile(Handle, NULL, NULL, NULL, &IoStatusBlock, 00121 &CabFileHeader, sizeof(CabFileHeader), &ByteOffset, NULL); 00122 00123 if(NT_SUCCESS(Status)) 00124 { 00125 if(CabFileHeader.Signature == CAB_SIGNATURE) 00126 { 00127 // We have a valid CAB file! 00128 // Read the file table now and decrement the file count on every file. When it's zero, we read the complete table. 00129 ByteOffset.LowPart = CabFileHeader.FileTableOffset; 00130 00131 while(CabFileHeader.FileCount) 00132 { 00133 Status = ZwReadFile(Handle, NULL, NULL, NULL, &IoStatusBlock, 00134 &CabFile, sizeof(CabFile), &ByteOffset, NULL); 00135 00136 if(NT_SUCCESS(Status)) 00137 { 00138 ByteOffset.LowPart += sizeof(CabFile); 00139 00140 // We assume here that the file name is max. 19 characters (+ 1 NULL character) long. 00141 // This should be enough for our purpose. 00142 Status = ZwReadFile(Handle, NULL, NULL, NULL, &IoStatusBlock, 00143 FileName, sizeof(FileName), &ByteOffset, NULL); 00144 00145 if(NT_SUCCESS(Status)) 00146 { 00147 if(!bFoundFile) 00148 { 00149 Status = RtlCharToInteger(FileName, 0, &ReadCP); 00150 if (NT_SUCCESS(Status) && ReadCP == CodePage) 00151 { 00152 // We got the correct file. 00153 // Save the offset and loop through the rest of the file table to find the position, where the actual data starts. 00154 CabFileOffset = CabFile.FileOffset; 00155 bFoundFile = TRUE; 00156 } 00157 } 00158 00159 ByteOffset.LowPart += strlen(FileName) + 1; 00160 } 00161 } 00162 00163 CabFileHeader.FileCount--; 00164 } 00165 00166 // 8 = Size of a CFFOLDER structure (see cabman). As we don't need the values of that structure, just increase the offset here. 00167 ByteOffset.LowPart += 8; 00168 ByteOffset.LowPart += CabFileOffset; 00169 00170 // ByteOffset now contains the offset of the actual data, so we can read the RAW font 00171 Status = ZwReadFile(Handle, NULL, NULL, NULL, &IoStatusBlock, 00172 FontBitField, 2048, &ByteOffset, NULL); 00173 ZwClose(Handle); 00174 return STATUS_SUCCESS; 00175 } 00176 else 00177 { 00178 DPRINT1("Error: CAB signature is missing!\n"); 00179 Status = STATUS_UNSUCCESSFUL; 00180 } 00181 } 00182 else 00183 DPRINT1("Error: Cannot read from file\n"); 00184 00185 ZwClose(Handle); 00186 return Status; 00187 } 00188 else 00189 { 00190 DPRINT1("Error: Cannot open vgafonts.cab\n"); 00191 return Status; 00192 } 00193 } 00194 00195 /* Font-load specific funcs */ 00196 VOID 00197 OpenBitPlane() 00198 { 00199 /* disable interrupts */ 00200 _disable(); 00201 00202 /* sequence reg */ 00203 WRITE_PORT_UCHAR (SEQ_COMMAND, SEQ_RESET); WRITE_PORT_UCHAR (SEQ_DATA, 0x01); 00204 WRITE_PORT_UCHAR (SEQ_COMMAND, SEQ_ENABLE_WRT_PLANE); WRITE_PORT_UCHAR (SEQ_DATA, 0x04); 00205 WRITE_PORT_UCHAR (SEQ_COMMAND, SEQ_MEM_MODE); WRITE_PORT_UCHAR (SEQ_DATA, 0x07); 00206 WRITE_PORT_UCHAR (SEQ_COMMAND, SEQ_RESET); WRITE_PORT_UCHAR (SEQ_DATA, 0x03); 00207 00208 /* graphic reg */ 00209 WRITE_PORT_UCHAR (GCT_COMMAND, GCT_READ_PLANE); WRITE_PORT_UCHAR (GCT_DATA, 0x02); 00210 WRITE_PORT_UCHAR (GCT_COMMAND, GCT_RW_MODES); WRITE_PORT_UCHAR (GCT_DATA, 0x00); 00211 WRITE_PORT_UCHAR (GCT_COMMAND, GCT_GRAPH_MODE); WRITE_PORT_UCHAR (GCT_DATA, 0x00); 00212 00213 /* enable interrupts */ 00214 _enable(); 00215 } 00216 00217 VOID 00218 CloseBitPlane() 00219 { 00220 /* disable interrupts */ 00221 _disable(); 00222 00223 /* sequence reg */ 00224 WRITE_PORT_UCHAR (SEQ_COMMAND, SEQ_RESET); WRITE_PORT_UCHAR (SEQ_DATA, 0x01); 00225 WRITE_PORT_UCHAR (SEQ_COMMAND, SEQ_ENABLE_WRT_PLANE); WRITE_PORT_UCHAR (SEQ_DATA, 0x03); 00226 WRITE_PORT_UCHAR (SEQ_COMMAND, SEQ_MEM_MODE); WRITE_PORT_UCHAR (SEQ_DATA, 0x03); 00227 WRITE_PORT_UCHAR (SEQ_COMMAND, SEQ_RESET); WRITE_PORT_UCHAR (SEQ_DATA, 0x03); 00228 00229 /* graphic reg */ 00230 WRITE_PORT_UCHAR (GCT_COMMAND, GCT_READ_PLANE); WRITE_PORT_UCHAR (GCT_DATA, 0x00); 00231 WRITE_PORT_UCHAR (GCT_COMMAND, GCT_RW_MODES); WRITE_PORT_UCHAR (GCT_DATA, 0x10); 00232 WRITE_PORT_UCHAR (GCT_COMMAND, GCT_GRAPH_MODE); WRITE_PORT_UCHAR (GCT_DATA, 0x0e); 00233 00234 /* enable interrupts */ 00235 _enable(); 00236 } 00237 00238 VOID 00239 LoadFont(PUCHAR Bitplane, PUCHAR FontBitfield) 00240 { 00241 UINT32 i,j; 00242 00243 for (i=0; i<256; i++) 00244 { 00245 for (j=0; j<8; j++) 00246 { 00247 *Bitplane = FontBitfield[i*8+j]; 00248 Bitplane++; 00249 } 00250 00251 // padding 00252 for (j=8; j<32; j++) 00253 { 00254 *Bitplane = 0; 00255 Bitplane++; 00256 } 00257 } 00258 } 00259 Generated on Sat May 26 2012 04:19:41 for ReactOS by
1.7.6.1
|