1 /* 2 * COPYRIGHT: See COPYING in the top level directory 3 * PROJECT: ReactOS Kernel Streaming 4 * FILE: dll/directx/ksuser/ksuser.c 5 * PURPOSE: KS USER functions 6 * PROGRAMMER: Magnus Olsen and Dmitry Chapyshev and Johannes Anderwald 7 */ 8 9 #include "ksuser.h" 10 #define NDEBUG 11 #include <debug.h> 12 13 NTSTATUS 14 NTAPI 15 KsiCreateObjectType( HANDLE hHandle, 16 LPWSTR ObjectType, 17 PVOID Buffer, 18 ULONG BufferSize, 19 ACCESS_MASK DesiredAccess, 20 PHANDLE phHandle) 21 { 22 NTSTATUS Status; 23 SIZE_T Length; 24 SIZE_T TotalSize; 25 LPWSTR pStr; 26 UNICODE_STRING ObjectName; 27 OBJECT_ATTRIBUTES ObjectAttributes; 28 IO_STATUS_BLOCK IoStatusBlock; 29 30 /* get length of object type */ 31 Length = wcslen(ObjectType); 32 33 /* get length for request */ 34 TotalSize = (Length * sizeof(WCHAR)) + BufferSize; 35 36 /* append space for '\\'*/ 37 TotalSize += sizeof(WCHAR); 38 39 /* allocate buffer */ 40 pStr = HeapAlloc(GetProcessHeap(), 0, TotalSize); 41 if (!pStr) 42 { 43 /* out of memory */ 44 return ERROR_NOT_ENOUGH_MEMORY; 45 } 46 47 /* copy object type */ 48 wcscpy(pStr, ObjectType); 49 50 /* append slash */ 51 pStr[Length] = L'\\'; 52 53 /* append parameters */ 54 memcpy(&pStr[Length+1], Buffer, BufferSize); 55 56 /* initialize object name */ 57 ObjectName.Buffer = pStr; 58 ObjectName.Length = ObjectName.MaximumLength = TotalSize; 59 60 /* initialize object attributes */ 61 InitializeObjectAttributes(&ObjectAttributes, &ObjectName, OBJ_CASE_INSENSITIVE, hHandle, NULL); 62 63 /* create the object */ 64 Status = NtCreateFile(phHandle, DesiredAccess, &ObjectAttributes, &IoStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL, 0, 1, 0, NULL, 0); 65 66 /* free buffer */ 67 HeapFree(GetProcessHeap(), 0, pStr); 68 69 /* check for success */ 70 if (!NT_SUCCESS(Status)) 71 { 72 /* failed zero handle */ 73 *phHandle = INVALID_HANDLE_VALUE; 74 75 /* convert error code */ 76 Status = RtlNtStatusToDosError(Status); 77 } 78 79 /* done */ 80 return Status; 81 } 82 83 /*++ 84 * @name KsCreateAllocator 85 * @implemented 86 * The function KsCreateAllocator creates a handle to an allocator for the given sink connection handle 87 * 88 * @param HANDLE ConnectionHandle 89 * Handle to the sink connection on which to create the allocator 90 * 91 * @param PKSALLOCATOR_FRAMING AllocatorFraming 92 * the input param we using to alloc our framing 93 * 94 * @param PHANDLE AllocatorHandle 95 * Our new handle that we have alloc 96 * 97 * @return 98 * Return NTSTATUS error code or sussess code. 99 * 100 * @remarks. 101 * none 102 * 103 *--*/ 104 KSDDKAPI 105 DWORD 106 NTAPI 107 KsCreateAllocator(HANDLE ConnectionHandle, 108 PKSALLOCATOR_FRAMING AllocatorFraming, 109 PHANDLE AllocatorHandle) 110 111 { 112 return KsiCreateObjectType( ConnectionHandle, 113 KSSTRING_Allocator, 114 (PVOID) AllocatorFraming, 115 sizeof(KSALLOCATOR_FRAMING), 116 GENERIC_READ, 117 AllocatorHandle); 118 } 119 120 /*++ 121 * @name KsCreateClock 122 * @implemented 123 * 124 * The function KsCreateClock creates handle to clock instance 125 * 126 * @param HANDLE ConnectionHandle 127 * Handle to use to create the clock 128 * 129 * @param PKSCLOCK_CREATE ClockCreate 130 * parameter to use to create the clock 131 * 132 * @param PHANDLE ClockHandle 133 * The new handle 134 * 135 * @return 136 * Return NTSTATUS error code or sussess code. 137 * 138 * @remarks. 139 * none 140 * 141 *--*/ 142 KSDDKAPI 143 DWORD 144 NTAPI 145 KsCreateClock(HANDLE ConnectionHandle, 146 PKSCLOCK_CREATE ClockCreate, 147 PHANDLE ClockHandle) 148 { 149 return KsiCreateObjectType( ConnectionHandle, 150 KSSTRING_Clock, 151 (PVOID) ClockCreate, 152 sizeof(KSCLOCK_CREATE), 153 GENERIC_READ, 154 ClockHandle); 155 } 156 157 /*++ 158 * @name KsCreatePin 159 * @implemented 160 * 161 * The function KsCreatePin passes a connection request to device and create pin instance 162 * 163 * @param HANDLE FilterHandle 164 * handle of the filter initiating the create request 165 * 166 * @param PKSPIN_CONNECT Connect 167 * Pointer to a KSPIN_CONNECT structure that contains parameters for the requested connection. 168 * This should be followed in memory by a KSDATAFORMAT data structure, describing the data format 169 * requested for the connection. 170 171 * @param ACCESS_MASK DesiredAccess 172 * Desired access 173 * 174 * @param PHANDLE ConnectionHandle 175 * connection handle passed 176 * 177 * @return 178 * Return NTSTATUS error code or sussess code. 179 * 180 * @remarks. 181 * The flag in PKSDATAFORMAT is not really document, 182 * to find it u need api monitor allot api and figout 183 * how it works, only flag I have found is the 184 * KSDATAFORMAT_ATTRIBUTES flag, it doing a Align 185 * of LONLONG size, it also round up it. 186 * 187 *--*/ 188 189 KSDDKAPI 190 DWORD 191 NTAPI 192 KsCreatePin(HANDLE FilterHandle, 193 PKSPIN_CONNECT Connect, 194 ACCESS_MASK DesiredAccess, 195 PHANDLE ConnectionHandle) 196 { 197 ULONG BufferSize = sizeof(KSPIN_CONNECT); 198 PKSDATAFORMAT DataFormat = (PKSDATAFORMAT)(Connect + 1); 199 200 BufferSize += DataFormat->FormatSize; 201 202 return KsiCreateObjectType(FilterHandle, 203 KSSTRING_Pin, 204 Connect, 205 BufferSize, 206 DesiredAccess, 207 ConnectionHandle); 208 209 } 210 211 /*++ 212 * @name KsCreateTopologyNode 213 * @implemented 214 * 215 * The function KsCreateTopologyNode creates a handle to a topology node instance 216 * 217 * @param HANDLE ParentHandle 218 * Handle to parent when want to use when we created the node on 219 * 220 * 221 * @param PKSNODE_CREATE NodeCreate 222 * topology node parameters to use when it is create 223 * 224 * @param ACCESS_MASK DesiredAccess 225 * Desired access 226 * 227 * @param PHANDLE NodeHandle 228 * Location for the topology node handle 229 * 230 * @return 231 * Return NTSTATUS error code or sussess code. 232 * 233 * @remarks. 234 * none 235 * 236 *--*/ 237 KSDDKAPI 238 DWORD 239 NTAPI 240 KsCreateTopologyNode(HANDLE ParentHandle, 241 PKSNODE_CREATE NodeCreate, 242 IN ACCESS_MASK DesiredAccess, 243 OUT PHANDLE NodeHandle) 244 { 245 return KsiCreateObjectType( ParentHandle, 246 KSSTRING_TopologyNode, 247 (PVOID) NodeCreate, 248 sizeof(KSNODE_CREATE), 249 DesiredAccess, 250 NodeHandle); 251 } 252 253 254 BOOL 255 APIENTRY 256 DllMain(HANDLE hModule, DWORD ulreason, LPVOID lpReserved) 257 { 258 switch (ulreason) 259 { 260 case DLL_PROCESS_ATTACH: 261 case DLL_THREAD_ATTACH: 262 case DLL_THREAD_DETACH: 263 case DLL_PROCESS_DETACH: 264 break; 265 } 266 267 return TRUE; 268 } 269