[KSUSER]
[reactos.git] / reactos / dll / directx / ksuser / ksuser.c
index 469fa67..8f62abf 100644 (file)
@@ -34,8 +34,40 @@ 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 + 4 * sizeof(WCHAR);
+
+    pStr = HeapAlloc(GetProcessHeap(), 0, TotalSize);
+    if (!pStr)
+        return STATUS_INSUFFICIENT_RESOURCES;
+    pStr[0] = L'\\';
+    wcscpy(&pStr[1], (LPWSTR)IID);
+    pStr[Length+1] = L'\\';
+    memcpy(&pStr[Length+2], Buffer, BufferSize);
+    pStr[Length+3+(BufferSize/sizeof(WCHAR))] = L'\0';
+
+    RtlInitUnicodeString(&ObjectName, pStr);
+    ObjectName.Length = ObjectName.MaximumLength = TotalSize;
+
+    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;
 }
 
 /*++
@@ -60,7 +92,7 @@ KsiCreateObjectType( HANDLE hHandle,
 *
 *--*/
 KSDDKAPI
-NTSTATUS
+DWORD
 NTAPI
 KsCreateAllocator(HANDLE ConnectionHandle,
                   PKSALLOCATOR_FRAMING AllocatorFraming,
@@ -98,7 +130,7 @@ KsCreateAllocator(HANDLE ConnectionHandle,
 *
 *--*/
 KSDDKAPI
-NTSTATUS
+DWORD
 NTAPI
 KsCreateClock(HANDLE ConnectionHandle,
               PKSCLOCK_CREATE ClockCreate,
@@ -145,7 +177,7 @@ KsCreateClock(HANDLE ConnectionHandle,
 *--*/
 
 KSDDKAPI
-NTSTATUS
+DWORD
 NTAPI
 KsCreatePin(HANDLE FilterHandle,
             PKSPIN_CONNECT Connect,
@@ -153,12 +185,9 @@ KsCreatePin(HANDLE FilterHandle,
             PHANDLE  ConnectionHandle)
 {
     ULONG BufferSize = sizeof(KSPIN_CONNECT);
-    PKSDATAFORMAT DataFormat = ((PKSDATAFORMAT) ( ((ULONG)Connect) + ((ULONG)sizeof(KSPIN_CONNECT)) ) );
+    PKSDATAFORMAT DataFormat = ((PKSDATAFORMAT) ((ULONG_PTR)Connect + sizeof(KSPIN_CONNECT)));
 
-    if (DataFormat->Flags &  KSDATAFORMAT_ATTRIBUTES)
-    {
-        BufferSize += (ROUND_UP(DataFormat->FormatSize,sizeof(LONGLONG)) + DataFormat->FormatSize);
-    }
+    BufferSize += DataFormat->FormatSize;
 
     return KsiCreateObjectType(FilterHandle,
                                KSSTRING_Pin,
@@ -196,7 +225,7 @@ KsCreatePin(HANDLE FilterHandle,
 *
 *--*/
 KSDDKAPI
-NTSTATUS
+DWORD
 NTAPI
 KsCreateTopologyNode(HANDLE ParentHandle,
                      PKSNODE_CREATE NodeCreate,