2 * COPYRIGHT: GPL, see COPYING in the top level directory
3 * PROJECT: ReactOS win32 kernel mode subsystem server
4 * PURPOSE: File access support routines
5 * FILE: subsystem/win32/win32k/misc/registry.c
6 * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org)
16 W32kDosPathNameToNtPathName(
17 IN PCWSTR pwszDosPathName
,
18 OUT PUNICODE_STRING pustrNtPathName
)
23 pustrNtPathName
->Length
= 0;
24 Status
= RtlAppendUnicodeToString(pustrNtPathName
, L
"\\??\\");
25 if (!NT_SUCCESS(Status
))
30 /* Append the dos name */
31 Status
= RtlAppendUnicodeToString(pustrNtPathName
, pwszDosPathName
);
32 if (!NT_SUCCESS(Status
))
43 W32kOpenFile(PCWSTR pwszFileName
, DWORD dwDesiredAccess
)
45 UNICODE_STRING ustrFile
;
46 OBJECT_ATTRIBUTES ObjectAttributes
;
47 IO_STATUS_BLOCK IoStatusBlock
;
48 HANDLE hFile
= INVALID_HANDLE_VALUE
;
51 DPRINT("W32kOpenFile(%S)\n", pwszFileName
);
53 RtlInitUnicodeString(&ustrFile
, pwszFileName
);
55 InitializeObjectAttributes(&ObjectAttributes
, &ustrFile
, 0, NULL
, NULL
);
57 Status
= ZwCreateFile(&hFile
,
62 FILE_ATTRIBUTE_NORMAL
,
65 FILE_NON_DIRECTORY_FILE
,
68 if (!NT_SUCCESS(Status
))
70 SetLastNtError(Status
);
74 DPRINT("Leaving W32kOpenFile, Status=0x%x, hFile=0x%x\n", Status
, hFile
);
80 W32kCreateFileSection(HANDLE hFile
,
82 DWORD flPageProtection
,
86 HANDLE hSection
= NULL
;
87 ACCESS_MASK amDesiredAccess
;
90 amDesiredAccess
= STANDARD_RIGHTS_REQUIRED
| SECTION_QUERY
| SECTION_MAP_READ
;
92 /* Check if write access is requested */
93 if (flPageProtection
== PAGE_READWRITE
)
95 /* Add it to access mask */
96 amDesiredAccess
|= SECTION_MAP_WRITE
;
99 /* Now create the actual section */
100 Status
= ZwCreateSection(&hSection
,
107 if (!NT_SUCCESS(Status
))
109 SetLastNtError(Status
);
112 DPRINT("Leaving W32kCreateFileSection, Status=0x%x, hSection=0x%x\n", Status
, hSection
);
114 /* Return section handle */
120 W32kMapViewOfSection(
123 ULONG_PTR ulSectionOffset
)
126 LARGE_INTEGER liSectionOffset
;
127 ULONG_PTR ulViewSize
;
131 liSectionOffset
.QuadPart
= ulSectionOffset
;
132 Status
= ZwMapViewOfSection(hSection
,
142 if (!NT_SUCCESS(Status
))
144 SetLastNtError(Status
);
147 DPRINT("Leaving W32kMapViewOfSection, Status=0x%x, pvBase=0x%x\n", Status
, pvBase
);
152 // FIXME: this should go to dibobj.c
158 UserLoadImage(PCWSTR pwszName
)
161 HANDLE hFile
, hSection
;
162 BITMAPFILEHEADER
*pbmfh
;
167 BITMAPV5INFO bmiLocal
;
169 DPRINT("Enter UserLoadImage(%ls)\n", pwszName
);
172 hFile
= W32kOpenFile(pwszName
, FILE_READ_DATA
);
178 /* Create a section */
179 hSection
= W32kCreateFileSection(hFile
, SEC_COMMIT
, PAGE_READONLY
, 0);
186 /* Map the section */
187 pbmfh
= W32kMapViewOfSection(hSection
, PAGE_READONLY
, 0);
194 /* Get a pointer to the BITMAPINFO */
195 pbmi
= (LPBITMAPINFO
)(pbmfh
+ 1);
197 /* Create a normalized local BITMAPINFO */
200 Status
= ProbeAndConvertToBitmapV5Info(&bmiLocal
,
205 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
207 Status
= _SEH2_GetExceptionCode();
211 if (NT_SUCCESS(Status
))
213 cjInfoSize
= bmiLocal
.bmiHeader
.bV5Size
+
214 bmiLocal
.bmiHeader
.bV5ClrUsed
* sizeof(RGBQUAD
);
215 pvBits
= (PVOID
)((PCHAR
)pbmi
+ cjInfoSize
);
217 // FIXME: use Gre... so that the BITMAPINFO doesn't get probed
218 hbmp
= NtGdiCreateDIBitmapInternal(NULL
,
219 bmiLocal
.bmiHeader
.bV5Width
,
220 bmiLocal
.bmiHeader
.bV5Height
,
225 bmiLocal
.bmiHeader
.bV5Size
,
226 bmiLocal
.bmiHeader
.bV5SizeImage
,
231 /* Unmap our section, we don't need it anymore */
232 ZwUnmapViewOfSection(NtCurrentProcess(), pbmfh
);
234 DPRINT("Leaving UserLoadImage, hbmp = %p\n", hbmp
);