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
)
160 NTSTATUS Status
= STATUS_SUCCESS
;
161 HANDLE hFile
, hSection
;
162 BITMAPFILEHEADER
*pbmfh
;
167 DPRINT("Enter UserLoadImage(%ls)\n", pwszName
);
170 hFile
= W32kOpenFile(pwszName
, FILE_READ_DATA
);
176 /* Create a section */
177 hSection
= W32kCreateFileSection(hFile
, SEC_COMMIT
, PAGE_READONLY
, 0);
184 /* Map the section */
185 pbmfh
= W32kMapViewOfSection(hSection
, PAGE_READONLY
, 0);
192 /* Get a pointer to the BITMAPINFO */
193 pbmi
= (LPBITMAPINFO
)(pbmfh
+ 1);
197 ProbeForRead(&pbmfh
->bfSize
, sizeof(DWORD
), 1);
198 ProbeForRead(pbmfh
, pbmfh
->bfSize
, 1);
200 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
202 Status
= _SEH2_GetExceptionCode();
206 if(!NT_SUCCESS(Status
))
208 DPRINT1("Bad File?\n");
212 if (pbmfh
->bfType
== 0x4D42 /* 'BM' */)
214 /* Could be BITMAPCOREINFO */
215 BITMAPINFO
* pConvertedInfo
;
217 pvBits
= (PVOID
)((PCHAR
)pbmi
+ pbmfh
->bfOffBits
);
219 pConvertedInfo
= DIB_ConvertBitmapInfo(pbmi
, DIB_RGB_COLORS
);
222 DPRINT1("Unable to convert the bitmap Info\n");
226 // FIXME: use Gre... so that the BITMAPINFO doesn't get probed
227 hbmp
= NtGdiCreateDIBitmapInternal(NULL
,
228 pConvertedInfo
->bmiHeader
.biWidth
,
229 pConvertedInfo
->bmiHeader
.biHeight
,
234 pConvertedInfo
->bmiHeader
.biSize
,
235 pConvertedInfo
->bmiHeader
.biSizeImage
,
239 DIB_FreeConvertedBitmapInfo(pConvertedInfo
, pbmi
);
243 DPRINT1("Unknown file type!\n");
247 /* Unmap our section, we don't need it anymore */
248 ZwUnmapViewOfSection(NtCurrentProcess(), pbmfh
);
250 DPRINT("Leaving UserLoadImage, hbmp = %p\n", hbmp
);