Author: tkreuzer
Date: Mon May 30 17:16:08 2011
New Revision: 52011

URL: http://svn.reactos.org/svn/reactos?rev=52011&view=rev
Log:
[WIN32K]
- Implement InitMappingImpl that initializes ghsemModuleList
- Use ZwCreateSection in EngLoadModuleEx. This is overhead in terms of code and 
runtime, but is neccessary, since we cannot pass a kernel file handle to 
MmCreateSection and passing a file object pointer is not supported on reactos 
yet.
- Set proper access mask and page protection in EngLoadModuleEx

Modified:
    branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/eng/mapping.c
    branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/include/mapping.h
    branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/main/dllmain.c

Modified: branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/eng/mapping.c
URL: 
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/eng/mapping.c?rev=52011&r1=52010&r2=52011&view=diff
==============================================================================
--- branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/eng/mapping.c 
[iso-8859-1] (original)
+++ branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/eng/mapping.c 
[iso-8859-1] Mon May 30 17:16:08 2011
@@ -14,6 +14,16 @@
 HANDLE ghSystem32Directory;
 HSEMAPHORE ghsemModuleList;
 LIST_ENTRY gleModulelist = {&gleModulelist, &gleModulelist};
+
+INIT_FUNCTION
+NTSTATUS
+NTAPI
+InitMappingImpl(VOID)
+{
+    ghsemModuleList = EngCreateSemaphore();
+    if (!ghsemModuleList) return STATUS_NO_MEMORY;
+    return STATUS_SUCCESS;
+}
 
 PVOID
 NTAPI
@@ -222,11 +232,12 @@
     UNICODE_STRING ustrFileName;
     IO_STATUS_BLOCK IoStatusBlock;
     FILE_BASIC_INFORMATION FileInformation;
-    HANDLE hFile = NULL;
+    HANDLE hFile = NULL, hSection;
     NTSTATUS Status;
     LARGE_INTEGER liSize;
     PLIST_ENTRY ple;
-    ULONG cjSize;
+    ULONG cjSize, flPageProtect;
+    ACCESS_MASK amAccess;
 
     /* Acquire module list lock */
     EngAcquireSemaphore(ghsemModuleList);
@@ -245,6 +256,18 @@
 
     /* Use system32 root dir or absolute path */
     hRootDir = fl & FVF_SYSTEMROOT ? ghSystem32Directory : NULL;
+
+    /* Set access mask and page protection */
+    if (fl & FVF_WRITE)
+    {
+        amAccess = FILE_READ_DATA|FILE_WRITE_DATA;
+        flPageProtect =  PAGE_EXECUTE_READWRITE;
+    }
+    else
+    {
+        amAccess = FILE_READ_DATA;
+        flPageProtect = PAGE_EXECUTE_READ;
+    }
 
     /* Initialize unicode string and object attributes */
     RtlInitUnicodeString(&ustrFileName, pwsz);
@@ -256,7 +279,7 @@
 
     /* Now open the file */
     Status = ZwCreateFile(&hFile,
-                          FILE_READ_DATA,
+                          amAccess,
                           &ObjectAttributes,
                           &IoStatusBlock,
                           NULL,
@@ -328,14 +351,24 @@
 
     /* Create a section from the file */
     liSize.QuadPart = cjSizeOfModule;
-    Status = MmCreateSection(&pFileView->pSection,
+    Status = ZwCreateSection(&hSection,
                              SECTION_ALL_ACCESS,
                              NULL,
                              cjSizeOfModule ? &liSize : NULL,
-                             fl & FVF_READONLY ? PAGE_EXECUTE_READ : 
PAGE_EXECUTE_READWRITE,
+                             flPageProtect,
                              SEC_COMMIT,
-                             hFile,
-                             NULL);
+                             hFile);
+
+    if (NT_SUCCESS(Status))
+    {
+        Status = ObReferenceObjectByHandle(hSection,
+                                           SECTION_ALL_ACCESS,
+                                           MmSectionObjectType,
+                                           KernelMode,
+                                           &pFileView->pSection,
+                                           NULL);
+        ZwClose(hSection);
+    }
 
     if (!NT_SUCCESS(Status))
     {
@@ -362,7 +395,7 @@
 EngLoadModule(LPWSTR pwsz)
 {
     /* Forward to EngLoadModuleEx */
-    return (HANDLE)EngLoadModuleEx(pwsz, 0, FVF_READONLY | FVF_SYSTEMROOT);
+    return EngLoadModuleEx(pwsz, 0, FVF_SYSTEMROOT);
 }
 
 HANDLE
@@ -372,7 +405,7 @@
        IN ULONG  cjSizeOfModule)
 {
     /* Forward to EngLoadModuleEx */
-    return (HANDLE)EngLoadModuleEx(pwsz, cjSizeOfModule, FVF_SYSTEMROOT);
+    return EngLoadModuleEx(pwsz, cjSizeOfModule, FVF_WRITE|FVF_SYSTEMROOT);
 }
 
 PVOID

Modified: 
branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/include/mapping.h
URL: 
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/include/mapping.h?rev=52011&r1=52010&r2=52011&view=diff
==============================================================================
--- branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/include/mapping.h 
[iso-8859-1] (original)
+++ branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/include/mapping.h 
[iso-8859-1] Mon May 30 17:16:08 2011
@@ -38,9 +38,14 @@
 enum
 {
     FVF_SYSTEMROOT = 1,
-    FVF_READONLY = 2,
+    FVF_WRITE = 2,
     FVF_FONTFILE = 4,
 };
+
+INIT_FUNCTION
+NTSTATUS
+NTAPI
+InitMappingImpl(VOID);
 
 PVOID
 NTAPI

Modified: 
branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/main/dllmain.c
URL: 
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/main/dllmain.c?rev=52011&r1=52010&r2=52011&view=diff
==============================================================================
--- branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/main/dllmain.c 
[iso-8859-1] (original)
+++ branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/main/dllmain.c 
[iso-8859-1] Mon May 30 17:16:08 2011
@@ -138,9 +138,9 @@
 
                 DPRINT1("Shell process is exiting (%d)\n", ExitCode);
 
-                UserPostMessage(hwndSAS, 
-                                WM_LOGONNOTIFY, 
-                                LN_SHELL_EXITED, 
+                UserPostMessage(hwndSAS,
+                                WM_LOGONNOTIFY,
+                                LN_SHELL_EXITED,
                                 ExitCode);
             }
         }
@@ -534,6 +534,7 @@
     CreateStockObjects();
     CreateSysColorObjects();
 
+    NT_ROF(InitMappingImpl());
     NT_ROF(InitXlateImpl());
     NT_ROF(InitPDEVImpl());
     NT_ROF(InitLDEVImpl());


Reply via email to