3 /* ===============================================================
10 IN HANDLE ParentHandle
,
12 PVOID CreateParameters
,
13 UINT CreateParametersSize
,
14 IN ACCESS_MASK DesiredAccess
,
15 OUT PHANDLE NodeHandle
)
18 IO_STATUS_BLOCK IoStatusBlock
;
19 OBJECT_ATTRIBUTES ObjectAttributes
;
22 Name
.Length
= Name
.MaximumLength
= (wcslen(ObjectType
) + 1) * sizeof(WCHAR
) + CreateParametersSize
;
23 Name
.MaximumLength
+= sizeof(WCHAR
);
24 Name
.Buffer
= ExAllocatePool(NonPagedPool
, Name
.MaximumLength
);
28 return STATUS_INSUFFICIENT_RESOURCES
;
31 wcscpy(Name
.Buffer
, ObjectType
);
32 Name
.Buffer
[wcslen(ObjectType
)] = '\\';
34 RtlMoveMemory(Name
.Buffer
+ wcslen(ObjectType
) +1, CreateParameters
, CreateParametersSize
);
36 Name
.Buffer
[Name
.Length
/ 2] = L
'\0';
37 InitializeObjectAttributes(&ObjectAttributes
, &Name
, OBJ_KERNEL_HANDLE
| OBJ_CASE_INSENSITIVE
| OBJ_OPENIF
, ParentHandle
, NULL
);
40 Status
= IoCreateFile(NodeHandle
,
48 FILE_SYNCHRONOUS_IO_NONALERT
,
53 IO_NO_PARAMETER_CHECKING
| IO_FORCE_ACCESS_CHECK
);
55 ExFreePool(Name
.Buffer
);
63 KSDDKAPI NTSTATUS NTAPI
65 IN HANDLE ParentHandle
,
66 IN PKSNODE_CREATE NodeCreate
,
67 IN ACCESS_MASK DesiredAccess
,
68 OUT PHANDLE NodeHandle
)
70 return KspCreateObjectType(ParentHandle
,
71 L
"{0621061A-EE75-11D0-B915-00A0C9223196}",
73 sizeof(KSNODE_CREATE
),
81 KSDDKAPI NTSTATUS NTAPI
82 KsValidateTopologyNodeCreateRequest(
84 IN PKSTOPOLOGY Topology
,
85 OUT PKSNODE_CREATE
* NodeCreate
)
88 return STATUS_UNSUCCESSFUL
;
97 KsTopologyPropertyHandler(
99 IN PKSPROPERTY Property
,
101 IN
const KSTOPOLOGY
* Topology
)
103 UNICODE_STRING LocalMachine
= RTL_CONSTANT_STRING(L
"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\MediaCategories\\");
104 UNICODE_STRING Name
= RTL_CONSTANT_STRING(L
"Name");
105 UNICODE_STRING GuidString
;
106 UNICODE_STRING KeyName
;
107 OBJECT_ATTRIBUTES ObjectAttributes
;
108 KSMULTIPLE_ITEM
* Item
;
110 PIO_STACK_LOCATION IoStack
;
114 PKEY_VALUE_PARTIAL_INFORMATION KeyInfo
;
116 if (Property
->Flags
!= KSPROPERTY_TYPE_GET
)
118 Irp
->IoStatus
.Status
= STATUS_NOT_IMPLEMENTED
;
119 Irp
->IoStatus
.Information
= 0;
120 return STATUS_NOT_IMPLEMENTED
;
123 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
127 case KSPROPERTY_TOPOLOGY_CATEGORIES
:
128 Size
= sizeof(KSMULTIPLE_ITEM
) + Topology
->CategoriesCount
* sizeof(GUID
);
129 if (IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
< Size
)
131 Irp
->IoStatus
.Information
= Size
;
132 Status
= STATUS_BUFFER_TOO_SMALL
;
136 Item
= (KSMULTIPLE_ITEM
*)Irp
->UserBuffer
;
138 Item
->Count
= Topology
->CategoriesCount
;
140 RtlMoveMemory((PVOID
)(Item
+ 1), (PVOID
)Topology
->Categories
, Topology
->CategoriesCount
* sizeof(GUID
));
141 Irp
->IoStatus
.Information
= Size
;
142 Status
= STATUS_SUCCESS
;
145 case KSPROPERTY_TOPOLOGY_NODES
:
146 Size
= sizeof(KSMULTIPLE_ITEM
) + Topology
->TopologyNodesCount
* sizeof(GUID
);
147 if (IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
< Size
)
149 Irp
->IoStatus
.Information
= Size
;
150 Status
= STATUS_BUFFER_TOO_SMALL
;
154 Item
= (KSMULTIPLE_ITEM
*)Irp
->UserBuffer
;
156 Item
->Count
= Topology
->TopologyNodesCount
;
158 RtlMoveMemory((PVOID
)(Item
+ 1), (PVOID
)Topology
->TopologyNodes
, Topology
->TopologyNodesCount
* sizeof(GUID
));
159 Irp
->IoStatus
.Information
= Size
;
160 Status
= STATUS_SUCCESS
;
163 case KSPROPERTY_TOPOLOGY_CONNECTIONS
:
164 Size
= sizeof(KSMULTIPLE_ITEM
) + Topology
->TopologyConnectionsCount
* sizeof(KSTOPOLOGY_CONNECTION
);
165 if (IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
< Size
)
167 Irp
->IoStatus
.Information
= Size
;
168 Status
= STATUS_BUFFER_TOO_SMALL
;
172 Item
= (KSMULTIPLE_ITEM
*)Irp
->UserBuffer
;
174 Item
->Count
= Topology
->TopologyConnectionsCount
;
176 RtlMoveMemory((PVOID
)(Item
+ 1), (PVOID
)Topology
->TopologyConnections
, Topology
->TopologyConnectionsCount
* sizeof(KSTOPOLOGY_CONNECTION
));
177 Irp
->IoStatus
.Information
= Size
;
178 Status
= STATUS_SUCCESS
;
181 case KSPROPERTY_TOPOLOGY_NAME
:
182 Node
= (KSP_NODE
*)Property
;
184 Status
= RtlStringFromGUID(&Topology
->TopologyNodesNames
[Node
->NodeId
], &GuidString
);
185 if (!NT_SUCCESS(Status
))
187 Irp
->IoStatus
.Information
= 0;
192 KeyName
.MaximumLength
= LocalMachine
.Length
+ GuidString
.Length
+ sizeof(WCHAR
);
193 KeyName
.Buffer
= ExAllocatePool(PagedPool
, KeyName
.MaximumLength
);
196 Irp
->IoStatus
.Information
= 0;
200 RtlAppendUnicodeStringToString(&KeyName
, &LocalMachine
);
201 RtlAppendUnicodeStringToString(&KeyName
, &GuidString
);
204 InitializeObjectAttributes(&ObjectAttributes
, &KeyName
, OBJ_CASE_INSENSITIVE
, NULL
, NULL
);
205 Status
= ZwOpenKey(&hKey
, GENERIC_READ
, &ObjectAttributes
);
207 if (!NT_SUCCESS(Status
))
209 DPRINT1("ZwOpenKey() failed with status 0x%08lx\n", Status
);
210 ExFreePool(KeyName
.Buffer
);
211 Irp
->IoStatus
.Information
= 0;
214 ExFreePool(KeyName
.Buffer
);
215 Status
= ZwQueryValueKey(hKey
, &Name
, KeyValuePartialInformation
, NULL
, 0, &Size
);
216 if (!NT_SUCCESS(Status
) && Status
!= STATUS_BUFFER_TOO_SMALL
)
219 Irp
->IoStatus
.Information
= 0;
223 KeyInfo
= (PKEY_VALUE_PARTIAL_INFORMATION
) ExAllocatePool(NonPagedPool
, Size
);
226 Status
= STATUS_NO_MEMORY
;
230 Status
= ZwQueryValueKey(hKey
, &Name
, KeyValuePartialInformation
, (PVOID
)KeyInfo
, Size
, &Size
);
231 if (!NT_SUCCESS(Status
))
235 Irp
->IoStatus
.Information
= 0;
240 if (KeyInfo
->DataLength
+ sizeof(WCHAR
) > IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
)
242 Irp
->IoStatus
.Information
= KeyInfo
->DataLength
+ sizeof(WCHAR
);
243 Status
= STATUS_BUFFER_TOO_SMALL
;
248 RtlMoveMemory(Irp
->UserBuffer
, &KeyInfo
->Data
, KeyInfo
->DataLength
);
249 ((LPWSTR
)Irp
->UserBuffer
)[KeyInfo
->DataLength
/ sizeof(WCHAR
)] = L
'\0';
250 Irp
->IoStatus
.Information
= KeyInfo
->DataLength
+ sizeof(WCHAR
);
254 Irp
->IoStatus
.Information
= 0;
255 Status
= STATUS_NOT_IMPLEMENTED
;