Example #1
0
static co_rc_t co_os_file_block_detect_size_harddisk(HANDLE handle, unsigned long long *out_size)
{
	GET_LENGTH_INFORMATION length;
	IO_STATUS_BLOCK block;
	NTSTATUS status;

	length.Length.QuadPart = 0;

	status = ZwDeviceIoControlFile(handle, NULL, NULL, NULL, &block,
				       IOCTL_DISK_GET_LENGTH_INFO,
				       NULL, 0, &length, sizeof(length));

	if (status == STATUS_SUCCESS) {
		*out_size = length.Length.QuadPart;
		co_debug("returned size: %llu KBs", (*out_size >> 10));
		return CO_RC(OK);
	}
//
//	Queries the specified disk drive for it's geometry information.
//
NTSTATUS _stdcall BkGetDriveGeometry(
	PUNICODE_STRING DriveName, 
	PVOID			pDriveGeo
	)
{
	NTSTATUS	ntStatus;
	HANDLE		hDevice;           
	OBJECT_ATTRIBUTES	oa;
	IO_STATUS_BLOCK	IoStatus;
	PDISK_GEOMETRY	pDG = (PDISK_GEOMETRY)pDriveGeo;

	InitializeObjectAttributes(&oa, DriveName, OBJ_CASE_INSENSITIVE, NULL, NULL);
	ntStatus = ZwCreateFile(&hDevice, GENERIC_READ | SYNCHRONIZE, &oa, &IoStatus, NULL, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, 
		FILE_OPEN, FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);

	if (NT_SUCCESS(ntStatus))
	{
		ntStatus = ZwDeviceIoControlFile(hDevice, 0, NULL, NULL, &IoStatus, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, pDG, sizeof(DISK_GEOMETRY));
		ZwClose(hDevice);
	}	// if (NT_SUCCESS(ntStatus))

	return (ntStatus);
}
Example #3
0
void dc_fsf_connect()
{
	IO_STATUS_BLOCK iosb;
	fsf_functl      ioctl;
	NTSTATUS        status;
	HANDLE          h_dev;

	h_dev = io_open_device(DC_FSF_DEVICE_NAME);

	if (h_dev != NULL)
	{
		ioctl.get_flags = dc_get_hook_flags;
		ioctl.set_flags = NULL;

		status = ZwDeviceIoControlFile(
			h_dev, NULL, NULL, NULL, &iosb, DC_FSF_FUNCTL, &ioctl, sizeof(ioctl), &ioctl, sizeof(ioctl));

		if (NT_SUCCESS(status) != FALSE) {
			fsf_set_flags = ioctl.set_flags;
			fsf_set_conf  = ioctl.set_conf;
		}
		ZwClose(h_dev);
	}
}
NTSTATUS
ImScsiGetDiskSize(
__in HANDLE FileHandle,
__out __deref PIO_STATUS_BLOCK IoStatus,
__inout __deref PLARGE_INTEGER DiskSize)
{
    NTSTATUS status;

    {
        FILE_STANDARD_INFORMATION file_standard;

        status = ZwQueryInformationFile(FileHandle,
            IoStatus,
            &file_standard,
            sizeof(FILE_STANDARD_INFORMATION),
            FileStandardInformation);

        if (NT_SUCCESS(status))
        {
            *DiskSize = file_standard.EndOfFile;
            return status;
        }

        KdPrint(("PhDskMnt::FileStandardInformation not supported for "
            "target device. %#x\n", status));
    }

    // Retry with IOCTL_DISK_GET_LENGTH_INFO instead
    {
        GET_LENGTH_INFORMATION part_info = { 0 };

        status =
            ZwDeviceIoControlFile(FileHandle,
            NULL,
            NULL,
            NULL,
            IoStatus,
            IOCTL_DISK_GET_LENGTH_INFO,
            NULL,
            0,
            &part_info,
            sizeof(part_info));

        if (status == STATUS_PENDING)
        {
            ZwWaitForSingleObject(FileHandle, FALSE, NULL);
            status = IoStatus->Status;
        }

        if (NT_SUCCESS(status))
        {
            *DiskSize = part_info.Length;
            return status;
        }

        KdPrint(("PhDskMnt::IOCTL_DISK_GET_LENGTH_INFO not supported "
            "for target device. %#x\n", status));
    }

    // Retry with IOCTL_DISK_GET_PARTITION_INFO instead
    {
        PARTITION_INFORMATION part_info = { 0 };

        status =
            ZwDeviceIoControlFile(FileHandle,
            NULL,
            NULL,
            NULL,
            IoStatus,
            IOCTL_DISK_GET_PARTITION_INFO,
            NULL,
            0,
            &part_info,
            sizeof(part_info));

        if (status == STATUS_PENDING)
        {
            ZwWaitForSingleObject(FileHandle, FALSE, NULL);
            status = IoStatus->Status;
        }

        if (NT_SUCCESS(status))
        {
            *DiskSize = part_info.PartitionLength;
            return status;
        }

        KdPrint(("PhDskMnt::IOCTL_DISK_GET_PARTITION_INFO not supported "
            "for target device. %#x\n", status));
    }

    return status;
}
Example #5
0
NTSTATUS
NbiBind(
    IN PDEVICE Device,
    IN PCONFIG Config
    )

/*++

Routine Description:

    This routine binds the Netbios module of ISN to the IPX
    module, which provides the NDIS binding services.

Arguments:

    Device - Pointer to the Netbios device.

    Config - Pointer to the configuration information.

Return Value:

    The function value is the final status from the initialization operation.

--*/

{
    NTSTATUS Status;
    IO_STATUS_BLOCK IoStatusBlock;
    OBJECT_ATTRIBUTES ObjectAttributes;
/*    union {
        IPX_INTERNAL_BIND_INPUT Input;
        IPX_INTERNAL_BIND_OUTPUT Output;
    } Bind;
*/
    InitializeObjectAttributes(
        &ObjectAttributes,
        &Config->BindName,
        OBJ_CASE_INSENSITIVE,
        NULL,
        NULL);

    Status = ZwCreateFile(
                &Device->BindHandle,
                SYNCHRONIZE | GENERIC_READ,
                &ObjectAttributes,
                &IoStatusBlock,
                NULL,
                FILE_ATTRIBUTE_NORMAL,
                FILE_SHARE_READ | FILE_SHARE_WRITE,
                FILE_OPEN,
                FILE_SYNCHRONOUS_IO_NONALERT,
                NULL,
                0L);

    if (!NT_SUCCESS(Status)) {

        NB_DEBUG (BIND, ("Could not open IPX (%ws) %lx\n",
                    Config->BindName.Buffer, Status));
        NbiWriteGeneralErrorLog(
            Device,
            EVENT_TRANSPORT_ADAPTER_NOT_FOUND,
            1,
            Status,
            Config->BindName.Buffer,
            0,
            NULL);
        return Status;
    }

    //
    // Fill in our bind data.
    //

#if     defined(_PNP_POWER)
    Device->BindInput.Version = ISN_VERSION;
#else
    Device->BindInput.Version = 1;
#endif  _PNP_POWER
    Device->BindInput.Identifier = IDENTIFIER_NB;
    Device->BindInput.BroadcastEnable = TRUE;
    Device->BindInput.LookaheadRequired = 192;
    Device->BindInput.ProtocolOptions = 0;
    Device->BindInput.ReceiveHandler = NbiReceive;
    Device->BindInput.ReceiveCompleteHandler = NbiReceiveComplete;
    Device->BindInput.StatusHandler = NbiStatus;
    Device->BindInput.SendCompleteHandler = NbiSendComplete;
    Device->BindInput.TransferDataCompleteHandler = NbiTransferDataComplete;
    Device->BindInput.FindRouteCompleteHandler = NbiFindRouteComplete;
    Device->BindInput.LineUpHandler = NbiLineUp;
    Device->BindInput.LineDownHandler = NbiLineDown;
    Device->BindInput.ScheduleRouteHandler = NULL;
#if     defined(_PNP_POWER)
    Device->BindInput.PnPHandler = NbiPnPNotification;
#endif  _PNP_POWER


    Status = ZwDeviceIoControlFile(
                Device->BindHandle,         // HANDLE to File
                NULL,                       // HANDLE to Event
                NULL,                       // ApcRoutine
                NULL,                       // ApcContext
                &IoStatusBlock,             // IO_STATUS_BLOCK
                IOCTL_IPX_INTERNAL_BIND,    // IoControlCode
                &Device->BindInput,                      // Input Buffer
                sizeof(Device->BindInput),               // Input Buffer Length
                &Device->Bind,                      // OutputBuffer
                sizeof(Device->Bind));              // OutputBufferLength

    //
    // We open synchronous, so this shouldn't happen.
    //

    CTEAssert (Status != STATUS_PENDING);

    //
    // Save the bind data.
    //

    if (Status == STATUS_SUCCESS) {

        NB_DEBUG2 (BIND, ("Successfully bound to IPX (%ws)\n",
                    Config->BindName.Buffer));
//        RtlCopyMemory (&Device->Bind, &Bind.Output, sizeof(IPX_INTERNAL_BIND_OUTPUT));

#if     !defined(_PNP_POWER)
        RtlZeroMemory (Device->ReservedNetbiosName, 16);
        RtlCopyMemory (&Device->ReservedNetbiosName[10], Device->Bind.Node, 6);

        Status = (*Device->Bind.QueryHandler)(   // BUGBUG: Check return code
                     IPX_QUERY_MAXIMUM_NIC_ID,
                     (USHORT)0,
                     &Device->MaximumNicId,
                     sizeof(Device->MaximumNicId),
                     NULL);
        CTEAssert (Status == STATUS_SUCCESS);
#endif  !_PNP_POWER

    } else {

        NB_DEBUG (BIND, ("Could not bind to IPX (%ws) %lx\n",
                    Config->BindName.Buffer, Status));
        NbiWriteGeneralErrorLog(
            Device,
            EVENT_TRANSPORT_BINDING_FAILED,
            1,
            Status,
            Config->BindName.Buffer,
            0,
            NULL);
        ZwClose(Device->BindHandle);
    }

    return Status;

}   /* NbiBind */
Example #6
0
//////////////////////////////////////////////////////////////////////////
//如果提供的缓存区不够大,返回STATUS_BUFFER_TOO_SMALL
NTSTATUS GetAdapterInfo(ADAPTER_INFOEX *pAIEX,  PULONG Size2Take)
{

	NTSTATUS                status;
	HANDLE                    hAdapter = NULL;
	PKEY_FULL_INFORMATION    pKeyFullInfo = NULL;
	ULONG					uTmp;
	ULONG					 uCounter=0;

	do
	{
		//        UNICODE_STRING            ustrAdapter = UNICODE_STRING_CONST(L";\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}";);
		UNICODE_STRING            ustrAdapter = UNICODE_STRING_CONST(L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Adapters");
		OBJECT_ATTRIBUTES        ObjAttrib;
		ULONG                    nSize;
		ULONG                    nIndex;


		InitializeObjectAttributes(&ObjAttrib, &ustrAdapter, OBJ_CASE_INSENSITIVE, NULL, NULL);
		status = ZwOpenKey(&hAdapter, KEY_READ, &ObjAttrib);
		if (!NT_SUCCESS(status))
		{
			//DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,"ZwOpenKey Error: %x\n", status);
			break;
		}
		ZwQueryKey(hAdapter, KeyFullInformation, NULL, 0, &nSize);
		pKeyFullInfo = (PKEY_FULL_INFORMATION)kmalloc( nSize);
		if (!pKeyFullInfo)
		{
			status = STATUS_INSUFFICIENT_RESOURCES;
			break;
		}
		status  = ZwQueryKey(hAdapter, KeyFullInformation, pKeyFullInfo, nSize, &nSize);
		if (!NT_SUCCESS(status))
		{
			//DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,";ZwQueryKey Error: %x\n", status);
			break;
		}
		if (pAIEX==NULL)
		{
			status	=	STATUS_BUFFER_TOO_SMALL;
			*Size2Take	=	pKeyFullInfo->SubKeys*sizeof(ADAPTER_INFO)+sizeof(ULONG);
			break;
		}

		for (nIndex = 0; nIndex< pKeyFullInfo->SubKeys; nIndex ++)
		{
			PKEY_BASIC_INFORMATION        pKeyBasicInfo = NULL;
			HANDLE                        hDev = NULL;
			pKeyBasicInfo = NULL;

			do
			{
				UNICODE_STRING        strKeyName;
				UNICODE_STRING        ustrDev ;// UNICODE_STRING_CONST(DEV_DOS_ROOT L"{F6ACFAC2-D39E-4A43-A320-0CDB9E22B15B}");
				IO_STATUS_BLOCK        IoStatusBlock;
				ULONG                nOid;

				ZwEnumerateKey(hAdapter, nIndex, KeyBasicInformation, NULL, 0, &nSize);
				pKeyBasicInfo = (PKEY_BASIC_INFORMATION) kmalloc(nSize);
				if (NULL == pKeyBasicInfo)
				{
					status = STATUS_INSUFFICIENT_RESOURCES;
					break;
				}
				status = ZwEnumerateKey(hAdapter, nIndex, KeyBasicInformation, pKeyBasicInfo, nSize, &nSize);
				if (!NT_SUCCESS(status))
				{
					kprintf("ZwEnumerateKey fail \n");
					break;
				}

				strKeyName.Buffer = pKeyBasicInfo->Name;
				strKeyName.MaximumLength = (USHORT)pKeyBasicInfo->NameLength;
				strKeyName.Length = (USHORT)pKeyBasicInfo->NameLength;

				ustrDev.Buffer	=	kmalloc(strKeyName.MaximumLength+sizeof(DEV_DOS_ROOT));
				ustrDev.MaximumLength	=	strKeyName.MaximumLength+sizeof(DEV_DOS_ROOT);
				ustrDev.Length = 0;

				if (NULL == ustrDev.Buffer)
				{
					status = STATUS_INSUFFICIENT_RESOURCES;
					break;
				}
				RtlAppendUnicodeToString(&ustrDev, DEV_DOS_ROOT);
				status = RtlAppendUnicodeStringToString(&ustrDev, &strKeyName);
				if (STATUS_SUCCESS != status)
				{
					//DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,";RtlAppendUnicodeStringToString Error: %x\n", status);
					kfree(ustrDev.Buffer);
					break;
				}
				InitializeObjectAttributes(&ObjAttrib, &ustrDev, OBJ_CASE_INSENSITIVE, NULL, NULL);
				status = ZwOpenFile(&hDev,
					GENERIC_READ,
					&ObjAttrib,
					&IoStatusBlock,
					FILE_SHARE_READ,
					FILE_NON_DIRECTORY_FILE);
				if (STATUS_SUCCESS != status)
				{
					//DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,";ZwOpenFile %wZ,Error: %x\n", &ustrDev, status);
					kfree(ustrDev.Buffer);
					break;
				}
				

				//	nOid = OID_GEN_MEDIA_IN_USE;
// 				nOid	=	OID_GEN_PHYSICAL_MEDIUM; //网卡类型
// 				uTmp	=	sizeof(uTmp);
// 				status = ZwDeviceIoControlFile(hDev,
// 					NULL,
// 					NULL,
// 					NULL,
// 					&IoStatusBlock,
// 					IOCTL_NDIS_QUERY_GLOBAL_STATS,
// 					&nOid,
// 					sizeof(nOid),
// 					&uTmp,
// 					uTmp);
// 				if (STATUS_SUCCESS != status)
// 				{
// 					DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,";ZwDeviceIoControlFile OID_GEN_PHYSICAL_MEDIUM Error: 0X%x\n", status);
// 					uTmp	=	-1;
// 					if (status==STATUS_INVALID_PARAMETER)
// 					{
// 						// NdisPhysicalMediumUnspecified
// 					}
// 					//	break;
// 				}
	//其实这里应该先发OID_GEN_MEDIA_IN_USE获取下media类型

				nOid	=	OID_GEN_MEDIA_CONNECT_STATUS; //网卡类型
				uTmp	=	sizeof(uTmp);
				status = ZwDeviceIoControlFile(hDev,
					NULL,
					NULL,
					NULL,
					&IoStatusBlock,
					IOCTL_NDIS_QUERY_GLOBAL_STATS,
					&nOid,
					sizeof(nOid),
					&uTmp,
					uTmp);
				if (STATUS_SUCCESS != status)
				{
					//DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,";ZwDeviceIoControlFile OID_GEN_MEDIA_CONNECT_STATUS Error: 0X%x\n", status);
					uTmp	=	NdisMediaStateDisconnected;
					//	break;
				}
				pAIEX->pAI[uCounter].status	=	uTmp;
				kprintf(" %wZ, OID_GEN_MEDIA_CONNECT_STATUS %s \n", &ustrDev, uTmp == NdisMediaStateConnected ? "Connected" : "Disconnected");
				kfree(ustrDev.Buffer);
				uTmp	=	sizeof(pAIEX->pAI[uCounter].macAddress);
				nOid = OID_802_3_CURRENT_ADDRESS;
				status = ZwDeviceIoControlFile(hDev,
					NULL,
					NULL,
					NULL,
					&IoStatusBlock,
					IOCTL_NDIS_QUERY_GLOBAL_STATS,
					&nOid,
					sizeof(nOid),
					pAIEX->pAI[uCounter].macAddress,
					uTmp);
				if (STATUS_SUCCESS != status)
				{
					//DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,";ZwDeviceIoControlFile OID_802_3_PERMANENT_ADDRESS Error: 0x%x\n", status);
					break;
				}
				//DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,"Mac: %02X:%02X:%02X:%02X:%02X:%02X\n", pAIEX->pAI[uCounter].macAddress[0], pAIEX->pAI[uCounter].macAddress[1], pAIEX->pAI[uCounter].macAddress[2], pAIEX->pAI[uCounter].macAddress[3], pAIEX->pAI[uCounter].macAddress[4], pAIEX->pAI[uCounter].macAddress[5]);


				pAIEX->pAI[uCounter].GUID.Buffer	=	kmalloc(pKeyBasicInfo->NameLength);

				pAIEX->pAI[uCounter].GUID.Length = pAIEX->pAI[uCounter].GUID.MaximumLength	=	(USHORT)pKeyBasicInfo->NameLength;
				RtlCopyMemory(pAIEX->pAI[uCounter].GUID.Buffer, pKeyBasicInfo->Name, pKeyBasicInfo->NameLength);
				if (1)
				{
					CHAR	IPAddress[48];
					ANSI_STRING	aniString;
					UNICODE_STRING	uniString;
					char *pTmp=NULL;
					UNICODE_STRING   ustrAdapterInfo = UNICODE_STRING_CONST(L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\");
					WCHAR	*pPath	=kmalloc(ustrAdapterInfo.Length+pKeyBasicInfo->NameLength+2);
					RtlZeroMemory(pPath, ustrAdapterInfo.Length+pKeyBasicInfo->NameLength+2);
					RtlCopyMemory(pPath, ustrAdapterInfo.Buffer, ustrAdapterInfo.Length);
					pTmp	=	(char*)pPath;
					RtlCopyMemory(&pTmp[ustrAdapterInfo.Length], pKeyBasicInfo->Name, pKeyBasicInfo->NameLength);

					uTmp=0;
					uTmp	= sizeof(ULONG);
					status	=	KKGetKeyValue(pPath, L"EnableDHCP", &uTmp, &uTmp);
					if (NT_SUCCESS(status))
					{
						RtlZeroMemory(IPAddress, sizeof(IPAddress));
						//开启了DHCP情况
						if (uTmp==1)
						{
							pAIEX->pAI[uCounter].bDhcp	=	TRUE;

							//够长了,应该会自动截断
							RtlZeroMemory(IPAddress, sizeof(IPAddress));

							uTmp	=	sizeof(IPAddress);

							status = KKGetKeyValue(pPath, L"DhcpIPAddress", IPAddress, &uTmp);
							if (NT_SUCCESS(status))
							{

								RtlInitUnicodeString(&uniString, (WCHAR*)IPAddress);
								RtlUnicodeStringToAnsiString(&aniString, &uniString, TRUE);
								RtlZeroMemory(IPAddress, sizeof(IPAddress));
								RtlCopyMemory(IPAddress, aniString.Buffer, aniString.Length);
								pAIEX->pAI[uCounter].IPAddr	=	inet_addr(IPAddress);
								RtlFreeAnsiString(&aniString);
							}
							else
							{
								kprintf("fail 2 get DhcpIPAddress\n");
							}
							RtlZeroMemory(IPAddress, sizeof(IPAddress));

							uTmp	=	sizeof(IPAddress);

							status = KKGetKeyValue(pPath, L"DhcpDefaultGateway", IPAddress, &uTmp);
							if (NT_SUCCESS(status))
							{

								RtlInitUnicodeString(&uniString, (WCHAR*)IPAddress);
								RtlUnicodeStringToAnsiString(&aniString, &uniString, TRUE);
								RtlZeroMemory(IPAddress, sizeof(IPAddress));
								RtlCopyMemory(IPAddress, aniString.Buffer, aniString.Length);
								pAIEX->pAI[uCounter].GatewayIpAddr	=	inet_addr(IPAddress);
								RtlFreeAnsiString(&aniString);
							}
							else
							{
								kprintf("fail 2 get DhcpDefaultGateway\n");
							}
						}//if (uTmp==1)
						else
						{

							pAIEX->pAI[uCounter].bDhcp	=	FALSE;

							//够长了,应该会自动截断
							RtlZeroMemory(IPAddress, sizeof(IPAddress));
							uTmp	=	sizeof(IPAddress);

							status = KKGetKeyValue(pPath, L"IPAddress", IPAddress, &uTmp);
							if (NT_SUCCESS(status))
							{

								RtlInitUnicodeString(&uniString, (WCHAR*)IPAddress);
								RtlUnicodeStringToAnsiString(&aniString, &uniString, TRUE);
								RtlZeroMemory(IPAddress, sizeof(IPAddress));
								RtlCopyMemory(IPAddress, aniString.Buffer, aniString.Length);
								pAIEX->pAI[uCounter].IPAddr	=	inet_addr(IPAddress);
								RtlFreeAnsiString(&aniString);
							}
							else
							{
								kprintf("fail 2 get IPAddress\n");
							}
							RtlZeroMemory(IPAddress, sizeof(IPAddress));
							uTmp	=	sizeof(IPAddress);

							status = KKGetKeyValue(pPath, L"DefaultGateway", IPAddress, &uTmp);
							if (NT_SUCCESS(status))
							{

								RtlInitUnicodeString(&uniString, (WCHAR*)IPAddress);
								RtlUnicodeStringToAnsiString(&aniString, &uniString, TRUE);
								RtlZeroMemory(IPAddress, sizeof(IPAddress));
								RtlCopyMemory(IPAddress, aniString.Buffer, aniString.Length);
								pAIEX->pAI[uCounter].GatewayIpAddr	=	inet_addr(IPAddress);
								RtlFreeAnsiString(&aniString);
							}
							else
							{
								kprintf("fail 2 get DefaultGateway\n");
							}
						}
					}// end status = QueryRegistryValue(pPath, L"EnableDHCP

					if (pPath)
					{
						kfree(pPath);pPath=NULL;
					}


				}


				uCounter++;
				pAIEX->uNumber	=	uCounter;

			}while(0);
			if (hDev)
			{
				ZwClose(hDev);
			}

			if (pKeyBasicInfo)
			{
				kfree(pKeyBasicInfo);
			}
			if (STATUS_SUCCESS == status)
			{

				//                break;
			}
		}
	}while(0);

	if (pKeyFullInfo)
	{
		kfree(pKeyFullInfo);
	}
	if (hAdapter)
	{
		ZwClose(hAdapter);
	}


	return status;
}