ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

font.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.