|
|
Definition at line 158 of file connection.cpp.
Referenced by PcRegisterPhysicalConnection(), PcRegisterPhysicalConnectionFromExternal(), and PcRegisterPhysicalConnectionToExternal().
{
PSUBDEVICE_DESCRIPTOR FromSubDeviceDescriptor = NULL, ToSubDeviceDescriptor = NULL;
PSYMBOLICLINK_ENTRY SymEntry;
ISubdevice * FromSubDevice = NULL, *ToSubDevice = NULL;
NTSTATUS Status;
PPHYSICAL_CONNECTION_ENTRY FromEntry = NULL, ToEntry = NULL;
if (FromUnknown)
{
Status = FromUnknown->QueryInterface(IID_ISubdevice, (PVOID*)&FromSubDevice);
if (!NT_SUCCESS(Status))
goto cleanup;
Status = FromSubDevice->GetDescriptor(&FromSubDeviceDescriptor);
if (!NT_SUCCESS(Status))
goto cleanup;
if (IsListEmpty(&FromSubDeviceDescriptor->SymbolicLinkList))
{
Status = STATUS_UNSUCCESSFUL;
goto cleanup;
}
SymEntry = (PSYMBOLICLINK_ENTRY)CONTAINING_RECORD(FromSubDeviceDescriptor->SymbolicLinkList.Flink, SYMBOLICLINK_ENTRY, Entry);
FromString = &SymEntry->SymbolicLink;
}
if (ToUnknown)
{
Status = ToUnknown->QueryInterface(IID_ISubdevice, (PVOID*)&ToSubDevice);
if (!NT_SUCCESS(Status))
goto cleanup;
Status = ToSubDevice->GetDescriptor(&ToSubDeviceDescriptor);
if (!NT_SUCCESS(Status))
goto cleanup;
if (IsListEmpty(&ToSubDeviceDescriptor->SymbolicLinkList))
{
Status = STATUS_UNSUCCESSFUL;
goto cleanup;
}
SymEntry = (PSYMBOLICLINK_ENTRY)CONTAINING_RECORD(ToSubDeviceDescriptor->SymbolicLinkList.Flink, SYMBOLICLINK_ENTRY, Entry);
ToString = &SymEntry->SymbolicLink;
}
if (FromSubDeviceDescriptor)
{
FromEntry = (PPHYSICAL_CONNECTION_ENTRY)AllocateItem(NonPagedPool, sizeof(PHYSICAL_CONNECTION_ENTRY) + ToString->MaximumLength + sizeof(WCHAR), TAG_PORTCLASS);
if (!FromEntry)
{
Status = STATUS_INSUFFICIENT_RESOURCES;
goto cleanup;
}
}
if (ToSubDeviceDescriptor)
{
ToEntry = (PPHYSICAL_CONNECTION_ENTRY)AllocateItem(NonPagedPool, sizeof(PHYSICAL_CONNECTION_ENTRY) + FromString->MaximumLength + sizeof(WCHAR), TAG_PORTCLASS);
if (!ToEntry)
{
Status = STATUS_INSUFFICIENT_RESOURCES;
goto cleanup;
}
}
if (FromSubDeviceDescriptor)
{
FromEntry->FromPin = FromPin;
FromEntry->Connection.Pin = ToPin;
FromEntry->Connection.Size = sizeof(KSPIN_PHYSICALCONNECTION) + ToString->MaximumLength + sizeof(WCHAR);
RtlMoveMemory(&FromEntry->Connection.SymbolicLinkName, ToString->Buffer, ToString->MaximumLength);
FromEntry->Connection.SymbolicLinkName[ToString->Length / sizeof(WCHAR)] = UNICODE_NULL;
InsertTailList(&FromSubDeviceDescriptor->PhysicalConnectionList, &FromEntry->Entry);
}
if (ToSubDeviceDescriptor)
{
ToEntry->FromPin = ToPin;
ToEntry->Connection.Pin = FromPin;
ToEntry->Connection.Size = sizeof(KSPIN_PHYSICALCONNECTION) + FromString->MaximumLength + sizeof(WCHAR);
RtlMoveMemory(&ToEntry->Connection.SymbolicLinkName, FromString->Buffer, FromString->MaximumLength);
ToEntry->Connection.SymbolicLinkName[FromString->Length / sizeof(WCHAR)] = UNICODE_NULL;
InsertTailList(&ToSubDeviceDescriptor->PhysicalConnectionList, &ToEntry->Entry);
}
return STATUS_SUCCESS;
cleanup:
if (FromSubDevice)
FromSubDevice->Release();
if (ToSubDevice)
ToSubDevice->Release();
if (FromEntry)
FreeItem(FromEntry, TAG_PORTCLASS);
if (ToEntry)
FreeItem(ToEntry, TAG_PORTCLASS);
return Status;
}
|