Ejemplo n.º 1
0
NTSTATUS
NdasPortExtBuildSymbolicLinkName(
	__inout PUNICODE_STRING SymbolicLinkName,
	__in CONST GUID* ExternalTypeGuid)
{
	NTSTATUS status;
	UNICODE_STRING guidString;

	status = RtlStringFromGUID(ExternalTypeGuid, &guidString);
	if (!NT_SUCCESS(status))
	{
		return status;
	}

	status = RtlUnicodeStringCopyString(
		SymbolicLinkName, L"\\Device\\NdasPort_");
	if (!NT_SUCCESS(status))
	{
		return status;
	}

	status = RtlUnicodeStringCatUnicodeString(
		SymbolicLinkName, 
		&guidString);

	RtlFreeUnicodeString(&guidString);

	if (!NT_SUCCESS(status))
	{
		return status;
	}

	return STATUS_SUCCESS;
}
Ejemplo n.º 2
0
NTSTATUS
NdasPortFdoGetExtendedInterface(
	CONST GUID* ExternalTypeGuid,
	PFILE_OBJECT* ExternalFileObject,
	PDEVICE_OBJECT* ExternalDeviceObject,
	PNDAS_LU_QUERY_NDAS_LOGICALUNIT_INTERFACE* LogicalUnitInterface)
{
	NTSTATUS status;
	UNICODE_STRING externalDeviceTypeGuidString;
	WCHAR externalDeviceNameBuffer[64];
	UNICODE_STRING externalDeviceName;
	PIRP irp;
	KEVENT event;
	IO_STATUS_BLOCK ioStatus;
	NDASPORT_EXTERNAL_TYPE_GET_INTERFACE externalTypeGetInterface;

	PAGED_CODE();

	*ExternalFileObject = NULL;
	*ExternalDeviceObject = NULL;

	RtlInitEmptyUnicodeString(
		&externalDeviceName,
		externalDeviceNameBuffer,
		sizeof(externalDeviceNameBuffer));

	status = RtlStringFromGUID(
		ExternalTypeGuid,
		&externalDeviceTypeGuidString);

	if (!NT_SUCCESS(status))
	{
		return status;
	}

	status = RtlUnicodeStringCopyString(
		&externalDeviceName,
		L"\\Device\\NdasPort_");

	ASSERT(NT_SUCCESS(status));
	if (!NT_SUCCESS(status))
	{
		return status;
	}

	status = RtlUnicodeStringCat(
		&externalDeviceName,
		&externalDeviceTypeGuidString);

	RtlFreeUnicodeString(&externalDeviceTypeGuidString);

	ASSERT(NT_SUCCESS(status));
	if (!NT_SUCCESS(status))
	{
		return status;
	}

	status = IoGetDeviceObjectPointer(
		&externalDeviceName,
		FILE_ALL_ACCESS,
		ExternalFileObject,
		ExternalDeviceObject);

	if (!NT_SUCCESS(status))
	{
		return status;
	}

	KeInitializeEvent(&event, NotificationEvent, FALSE);

	externalTypeGetInterface.Size = sizeof(NDASPORT_EXTERNAL_TYPE_GET_INTERFACE);
	externalTypeGetInterface.Version = NDASPORT_EXTERNAL_TYPE_GET_INTERFACE_VERSION;
	externalTypeGetInterface.ExternalTypeGuid = *ExternalTypeGuid;
	externalTypeGetInterface.GetInterfaceFunction = NULL;
	
	irp = IoBuildDeviceIoControlRequest(
		NDASPORTEXT_IOCTL_GET_LOGICALUNIT_INTERFACE,
		*ExternalDeviceObject,
		&externalTypeGetInterface, sizeof(NDASPORT_EXTERNAL_TYPE_GET_INTERFACE),
		&externalTypeGetInterface, sizeof(NDASPORT_EXTERNAL_TYPE_GET_INTERFACE),
		TRUE,
		&event,
		&ioStatus);

	if (NULL == irp)
	{
		status = STATUS_INSUFFICIENT_RESOURCES;
		goto error1;
	}

	status = IoCallDriver(*ExternalDeviceObject, irp);

	if (!NT_SUCCESS(status))
	{
		goto error2;
	}

	KeWaitForSingleObject(
		&event, 
		Executive, 
		KernelMode, 
		FALSE, 
		NULL);

	status = ioStatus.Status;

	if (!NT_SUCCESS(status))
	{
		goto error3;
	}
	
	*LogicalUnitInterface = externalTypeGetInterface.GetInterfaceFunction;

	return status;

error3:
error2:
error1:

	ObDereferenceObject(*ExternalFileObject);
	*ExternalDeviceObject = NULL;
	*ExternalFileObject = NULL;

	return status;
}
Ejemplo n.º 3
0
NTSTATUS
FileDiskQueryPnpID(
    __in PNDAS_LOGICALUNIT_EXTENSION LogicalUnitExtension,
    __in BUS_QUERY_ID_TYPE QueryType,
    __in ULONG Index,
    __inout PUNICODE_STRING UnicodeStringId)
{
    static CONST WCHAR* HARDWARE_IDS[] = {
        NDASPORT_ENUMERATOR_GUID_PREFIX L"FileDisk",
        NDASPORT_ENUMERATOR_NAMED_PREFIX L"FileDisk",
        L"GenDisk",
    };
    static CONST WCHAR* COMPATIBLE_IDS[] = { L"gendisk" };
    WCHAR instanceId[20];
    WCHAR* instanceIdList[] = { instanceId };

    NTSTATUS status;
    PFILEDISK_EXTENSION fileDiskExtension;

    CONST WCHAR** idList;
    ULONG idListCount;

    fileDiskExtension = FileDiskGetExtension(LogicalUnitExtension);

    switch (QueryType)
    {
    case BusQueryDeviceID:
        idList = HARDWARE_IDS;
        idListCount = 1;
        break;
    case BusQueryHardwareIDs:
        idList = HARDWARE_IDS;
        idListCount = countof(HARDWARE_IDS);
        break;
    case BusQueryCompatibleIDs:
        idList = COMPATIBLE_IDS;
        idListCount = countof(COMPATIBLE_IDS);
        break;
    case BusQueryInstanceID:
        idList = (const WCHAR**) instanceIdList;
        idListCount = 1;
        status = RtlStringCchPrintfW(
                     instanceId,
                     countof(instanceId),
                     L"%08X",
                     RtlUlongByteSwap(fileDiskExtension->LogicalUnitAddress));
        ASSERT(NT_SUCCESS(status));
        break;
    case 4 /*BusQueryDeviceSerialNumber*/:
    default:
        return STATUS_NOT_SUPPORTED;
    }

    if (Index >= idListCount)
    {
        return STATUS_NO_MORE_ENTRIES;
    }

    status = RtlUnicodeStringCopyString(
                 UnicodeStringId,
                 idList[Index]);

    return status;
}