From bf29e0ff1da1552865d3144d92bf0b7b13b6e1f0 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Mon, 19 Jan 2009 15:55:47 +0000 Subject: [PATCH] - Experimental implementation of KsiCreateObjectType svn path=/trunk/; revision=38940 --- reactos/dll/directx/ksuser/ksuser.c | 35 +++++++++++++++++++++++++++-- reactos/dll/directx/ksuser/ksuser.h | 19 +++++++++++++++- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/reactos/dll/directx/ksuser/ksuser.c b/reactos/dll/directx/ksuser/ksuser.c index 469fa672831..0e7654972e3 100644 --- a/reactos/dll/directx/ksuser/ksuser.c +++ b/reactos/dll/directx/ksuser/ksuser.c @@ -34,8 +34,39 @@ KsiCreateObjectType( HANDLE hHandle, ACCESS_MASK DesiredAccess, PHANDLE phHandle) { - UNIMPLEMENTED - return 0; + NTSTATUS Status; + ULONG Length; + ULONG TotalSize; + LPWSTR pStr; + UNICODE_STRING ObjectName; + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK IoStatusBlock; + + Length = wcslen(IID); + + TotalSize = (Length * sizeof(WCHAR)) + BufferSize + 2 * sizeof(WCHAR); + + pStr = HeapAlloc(GetProcessHeap(), 0, TotalSize); + if (!pStr) + return STATUS_INSUFFICIENT_RESOURCES; + + wcscpy(pStr, (LPWSTR)IID); + pStr[Length] = L'\\'; + memcpy(&pStr[Length+1], Buffer, BufferSize); + pStr[Length+1+BufferSize] = L'\0'; + + RtlInitUnicodeString(&ObjectName, pStr); + + InitializeObjectAttributes(&ObjectAttributes, &ObjectName, OBJ_CASE_INSENSITIVE, hHandle, NULL); + + Status = NtCreateFile(phHandle, DesiredAccess, &ObjectAttributes, &IoStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL, 0, 1, 0, NULL, 0); + HeapFree(GetProcessHeap(), 0, pStr); + if (!NT_SUCCESS(Status)) + { + *phHandle = INVALID_HANDLE_VALUE; + Status = RtlNtStatusToDosError(Status); + } + return Status; } /*++ diff --git a/reactos/dll/directx/ksuser/ksuser.h b/reactos/dll/directx/ksuser/ksuser.h index 326c7c765ef..2e00b47eced 100644 --- a/reactos/dll/directx/ksuser/ksuser.h +++ b/reactos/dll/directx/ksuser/ksuser.h @@ -1,5 +1,22 @@ +#ifndef KSUSER_H__ +#define KSUSER_H__ + #define _KSDDK_ + +#define WIN32_NO_STATUS #include -typedef LONG NTSTATUS; +#include + + #include #include + +LPVOID +__stdcall +HeapAlloc( + HANDLE hHeap, + DWORD dwFlags, + DWORD dwBytes +); + +#endif