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
15 KsiCreateObjectType( HANDLE hHandle
,
19 ACCESS_MASK DesiredAccess
,
26 UNICODE_STRING ObjectName
;
27 OBJECT_ATTRIBUTES ObjectAttributes
;
28 IO_STATUS_BLOCK IoStatusBlock
;
30 /* get length of object type */
31 Length
= wcslen(ObjectType
);
33 /* get length for request */
34 TotalSize
= (Length
* sizeof(WCHAR
)) + BufferSize
;
36 /* append space for '\\'*/
37 TotalSize
+= sizeof(WCHAR
);
40 pStr
= HeapAlloc(GetProcessHeap(), 0, TotalSize
);
44 return ERROR_NOT_ENOUGH_MEMORY
;
47 /* copy object type */
48 wcscpy(pStr
, ObjectType
);
53 /* append parameters */
54 memcpy(&pStr
[Length
+1], Buffer
, BufferSize
);
56 /* initialize object name */
57 ObjectName
.Buffer
= pStr
;
58 ObjectName
.Length
= ObjectName
.MaximumLength
= TotalSize
;
60 /* initialize object attributes */
61 InitializeObjectAttributes(&ObjectAttributes
, &ObjectName
, OBJ_CASE_INSENSITIVE
, hHandle
, NULL
);
63 /* create the object */
64 Status
= NtCreateFile(phHandle
, DesiredAccess
, &ObjectAttributes
, &IoStatusBlock
, NULL
, FILE_ATTRIBUTE_NORMAL
, 0, 1, 0, NULL
, 0);
67 HeapFree(GetProcessHeap(), 0, pStr
);
69 /* check for success */
70 if (!NT_SUCCESS(Status
))
72 /* failed zero handle */
73 *phHandle
= INVALID_HANDLE_VALUE
;
75 /* convert error code */
76 Status
= RtlNtStatusToDosError(Status
);
84 * @name KsCreateAllocator
86 * The function KsCreateAllocator creates a handle to an allocator for the given sink connection handle
88 * @param HANDLE ConnectionHandle
89 * Handle to the sink connection on which to create the allocator
91 * @param PKSALLOCATOR_FRAMING AllocatorFraming
92 * the input param we using to alloc our framing
94 * @param PHANDLE AllocatorHandle
95 * Our new handle that we have alloc
98 * Return NTSTATUS error code or sussess code.
107 KsCreateAllocator(HANDLE ConnectionHandle
,
108 PKSALLOCATOR_FRAMING AllocatorFraming
,
109 PHANDLE AllocatorHandle
)
112 return KsiCreateObjectType( ConnectionHandle
,
114 (PVOID
) AllocatorFraming
,
115 sizeof(KSALLOCATOR_FRAMING
),
121 * @name KsCreateClock
124 * The function KsCreateClock creates handle to clock instance
126 * @param HANDLE ConnectionHandle
127 * Handle to use to create the clock
129 * @param PKSCLOCK_CREATE ClockCreate
130 * paramenter to use to create the clock
132 * @param PHANDLE ClockHandle
136 * Return NTSTATUS error code or sussess code.
145 KsCreateClock(HANDLE ConnectionHandle
,
146 PKSCLOCK_CREATE ClockCreate
,
149 return KsiCreateObjectType( ConnectionHandle
,
152 sizeof(KSCLOCK_CREATE
),
161 * The function KsCreatePin passes a connection request to device and create pin instance
163 * @param HANDLE FilterHandle
164 * handle of the filter initiating the create request
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.
171 * @param ACCESS_MASK DesiredAccess
174 * @param PHANDLE ConnectionHandle
175 * connection handle passed
178 * Return NTSTATUS error code or sussess code.
181 * The flag in PKSDATAFORMAT is not really document,
182 * to find it u need api mointor 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.
192 KsCreatePin(HANDLE FilterHandle
,
193 PKSPIN_CONNECT Connect
,
194 ACCESS_MASK DesiredAccess
,
195 PHANDLE ConnectionHandle
)
197 ULONG BufferSize
= sizeof(KSPIN_CONNECT
);
198 PKSDATAFORMAT DataFormat
= ((PKSDATAFORMAT
) ((ULONG_PTR
)Connect
+ sizeof(KSPIN_CONNECT
)));
200 BufferSize
+= DataFormat
->FormatSize
;
202 return KsiCreateObjectType(FilterHandle
,
212 * @name KsCreateTopologyNode
215 * The function KsCreateTopologyNode creates a handle to a topology node instance
217 * @param HANDLE ParentHandle
218 * Handle to parent when want to use when we created the node on
221 * @param PKSNODE_CREATE NodeCreate
222 * topology node parameters to use when it is create
224 * @param ACCESS_MASK DesiredAccess
227 * @param PHANDLE NodeHandle
228 * Location for the topology node handle
231 * Return NTSTATUS error code or sussess code.
240 KsCreateTopologyNode(HANDLE ParentHandle
,
241 PKSNODE_CREATE NodeCreate
,
242 IN ACCESS_MASK DesiredAccess
,
243 OUT PHANDLE NodeHandle
)
245 return KsiCreateObjectType( ParentHandle
,
246 KSSTRING_TopologyNode
,
248 sizeof(KSNODE_CREATE
),
256 DllMain(HANDLE hModule
, DWORD ulreason
, LPVOID lpReserved
)
260 case DLL_PROCESS_ATTACH
:
261 case DLL_THREAD_ATTACH
:
262 case DLL_THREAD_DETACH
:
263 case DLL_PROCESS_DETACH
: