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
);
154 UserLoadImage(PCWSTR pwszName
)
156 NTSTATUS Status
= STATUS_SUCCESS
;
157 HANDLE hFile
, hSection
;
158 BITMAPFILEHEADER
*pbmfh
;
163 DPRINT("Enter UserLoadImage(%ls)\n", pwszName
);
166 hFile
= W32kOpenFile(pwszName
, FILE_READ_DATA
);
172 /* Create a section */
173 hSection
= W32kCreateFileSection(hFile
, SEC_COMMIT
, PAGE_READONLY
, 0);
180 /* Map the section */
181 pbmfh
= W32kMapViewOfSection(hSection
, PAGE_READONLY
, 0);
188 /* Get a pointer to the BITMAPINFO */
189 pbmi
= (LPBITMAPINFO
)(pbmfh
+ 1);
193 ProbeForRead(&pbmfh
->bfSize
, sizeof(DWORD
), 1);
194 ProbeForRead(pbmfh
, pbmfh
->bfSize
, 1);
196 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
198 Status
= _SEH2_GetExceptionCode();
202 if(!NT_SUCCESS(Status
))
204 DPRINT1("Bad File?\n");
208 if (pbmfh
->bfType
== 0x4D42 /* 'BM' */)
210 /* Could be BITMAPCOREINFO */
211 BITMAPINFO
* pConvertedInfo
;
214 pvBits
= (PVOID
)((PCHAR
)pbmfh
+ pbmfh
->bfOffBits
);
216 pConvertedInfo
= DIB_ConvertBitmapInfo(pbmi
, DIB_RGB_COLORS
);
219 DPRINT1("Unable to convert the bitmap Info\n");
223 hdc
= IntGdiCreateDC(NULL
, NULL
, NULL
, NULL
,FALSE
);
225 hbmp
= GreCreateDIBitmapInternal(hdc
,
226 pConvertedInfo
->bmiHeader
.biWidth
,
227 pConvertedInfo
->bmiHeader
.biHeight
,
235 NtGdiDeleteObjectApp(hdc
);
236 DIB_FreeConvertedBitmapInfo(pConvertedInfo
, pbmi
);
240 DPRINT1("Unknown file type!\n");
244 /* Unmap our section, we don't need it anymore */
245 ZwUnmapViewOfSection(NtCurrentProcess(), pbmfh
);
247 DPRINT("Leaving UserLoadImage, hbmp = %p\n", hbmp
);