mirror of
https://github.com/reactos/reactos.git
synced 2025-07-29 03:32:15 +00:00
implement last part of NtGdiCreateEnhMetaFile
it can now create file. (add ntdll.a to rbuild need RtlDosPathNameToNtPathName_U api) svn path=/trunk/; revision=24164
This commit is contained in:
parent
b6919c977d
commit
15732d3ae2
2 changed files with 55 additions and 27 deletions
|
@ -23,6 +23,9 @@
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
|
#define FILE_FLAG_POSIX_SEMANTICS 16777216
|
||||||
|
|
||||||
|
|
||||||
HENHMETAFILE
|
HENHMETAFILE
|
||||||
STDCALL
|
STDCALL
|
||||||
NtGdiCloseEnhMetaFile(HDC hDC)
|
NtGdiCloseEnhMetaFile(HDC hDC)
|
||||||
|
@ -66,7 +69,6 @@ NtGdiCreateEnhMetaFile(HDC hDCRef,
|
||||||
{
|
{
|
||||||
PDC Dc;
|
PDC Dc;
|
||||||
HDC ret = NULL;
|
HDC ret = NULL;
|
||||||
NTSTATUS Status;
|
|
||||||
IO_STATUS_BLOCK Iosb;
|
IO_STATUS_BLOCK Iosb;
|
||||||
DWORD length = 0;
|
DWORD length = 0;
|
||||||
HDC tempHDC;
|
HDC tempHDC;
|
||||||
|
@ -167,27 +169,54 @@ NtGdiCreateEnhMetaFile(HDC hDCRef,
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = tempHDC;
|
ret = tempHDC;
|
||||||
|
|
||||||
DPRINT1("File cretae unimplement in NtGdiCreateEnhMetaFile\n");
|
|
||||||
if (File)
|
if (File)
|
||||||
{
|
{
|
||||||
|
DPRINT1("Trying Create EnhMetaFile\n");
|
||||||
|
|
||||||
|
|
||||||
/* disk based metafile */
|
/* disk based metafile */
|
||||||
|
DWORD dwDesiredAccess = GENERIC_WRITE | GENERIC_READ | SYNCHRONIZE | FILE_READ_ATTRIBUTES;
|
||||||
|
|
||||||
/* FIXME
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||||
if ((Dc->hFile = CreateFileW(File, GENERIC_WRITE | GENERIC_READ, 0,
|
IO_STATUS_BLOCK IoStatusBlock;
|
||||||
NULL, CREATE_ALWAYS, 0, 0)) == INVALID_HANDLE_VALUE)
|
UNICODE_STRING NtPathU;
|
||||||
|
NTSTATUS Status;
|
||||||
|
ULONG FileAttributes = (FILE_ATTRIBUTE_VALID_FLAGS & ~FILE_ATTRIBUTE_DIRECTORY);
|
||||||
|
|
||||||
|
if (!RtlDosPathNameToNtPathName_U (File, &NtPathU, NULL, NULL))
|
||||||
{
|
{
|
||||||
DC_UnLockDc(Dc);
|
DC_UnlockDc(Dc);
|
||||||
if (hDCRef == NULL)
|
if (hDCRef == NULL)
|
||||||
{
|
{
|
||||||
NtGdiDeleteObjectApp(tempHDC);
|
NtGdiDeleteObjectApp(tempHDC);
|
||||||
}
|
}
|
||||||
return 0;
|
DPRINT1("Can not Create EnhMetaFile\n");
|
||||||
|
SetLastWin32Error(ERROR_PATH_NOT_FOUND);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
|
InitializeObjectAttributes(&ObjectAttributes, &NtPathU, 0, NULL, NULL);
|
||||||
|
|
||||||
|
Status = NtCreateFile (&Dc->hFile, dwDesiredAccess, &ObjectAttributes, &IoStatusBlock,
|
||||||
|
NULL, FileAttributes, 0, FILE_OVERWRITE_IF, FILE_NON_DIRECTORY_FILE,
|
||||||
|
NULL, 0);
|
||||||
|
|
||||||
|
RtlFreeHeap(RtlGetProcessHeap(), 0, NtPathU.Buffer);
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
Dc->hFile = NULL;
|
||||||
|
DC_UnlockDc(Dc);
|
||||||
|
if (hDCRef == NULL)
|
||||||
|
{
|
||||||
|
NtGdiDeleteObjectApp(tempHDC);
|
||||||
|
}
|
||||||
|
DPRINT1("Create EnhMetaFile fail\n");
|
||||||
|
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetLastWin32Error(IoStatusBlock.Information == FILE_OVERWRITTEN ? ERROR_ALREADY_EXISTS : 0);
|
||||||
|
|
||||||
Status = NtWriteFile(Dc->hFile, NULL, NULL, NULL, &Iosb, (PVOID)&Dc->emh, Dc->emh->nSize, NULL, NULL);
|
Status = NtWriteFile(Dc->hFile, NULL, NULL, NULL, &Iosb, (PVOID)&Dc->emh, Dc->emh->nSize, NULL, NULL);
|
||||||
if (Status == STATUS_PENDING)
|
if (Status == STATUS_PENDING)
|
||||||
|
@ -201,15 +230,13 @@ NtGdiCreateEnhMetaFile(HDC hDCRef,
|
||||||
|
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
//ret = Dc->hSelf;
|
|
||||||
ret = tempHDC;
|
ret = tempHDC;
|
||||||
DC_UnlockDc(Dc);
|
DC_UnlockDc(Dc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Dc->hFile = NULL;
|
Dc->hFile = NULL;
|
||||||
/* FIXME use SetLastErrorByStatus */
|
DPRINT1("Write to EnhMetaFile fail\n");
|
||||||
//SetLastErrorByStatus(Status);
|
|
||||||
SetLastWin32Error(ERROR_CAN_NOT_COMPLETE);
|
SetLastWin32Error(ERROR_CAN_NOT_COMPLETE);
|
||||||
ret = NULL;
|
ret = NULL;
|
||||||
DC_UnlockDc(Dc);
|
DC_UnlockDc(Dc);
|
||||||
|
|
|
@ -182,6 +182,7 @@
|
||||||
<library>win32k_base</library>
|
<library>win32k_base</library>
|
||||||
<library>pseh</library>
|
<library>pseh</library>
|
||||||
<library>ntoskrnl</library>
|
<library>ntoskrnl</library>
|
||||||
|
<library>ntdll</library>
|
||||||
<library>hal</library>
|
<library>hal</library>
|
||||||
<library>freetype</library>
|
<library>freetype</library>
|
||||||
<file>win32k.rc</file>
|
<file>win32k.rc</file>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue