BOOLEAN OpenHidDevice()

in XInput_Scp/pnp.cpp [158:261]


BOOLEAN OpenHidDevice(IN LPTSTR DevicePath, IN BOOL HasReadAccess, IN BOOL HasWriteAccess, IN BOOL IsOverlapped, IN BOOL IsExclusive, __inout PHID_DEVICE HidDevice)
{
    DWORD   accessFlags  = 0;
    DWORD   sharingFlags = 0;
    INT     iDevicePathSize;

    if (DevicePath == NULL)
    {
        return FALSE;
    }

    iDevicePathSize = (INT) (_tcslen(DevicePath) + 1) * sizeof(TCHAR);
    
    HidDevice->DevicePath = (PTCHAR) malloc(iDevicePathSize);

    if (HidDevice->DevicePath == NULL) 
    {
        return FALSE;
    }

    StringCbCopy(HidDevice->DevicePath, iDevicePathSize, DevicePath);
    
    if (HasReadAccess ) accessFlags |= GENERIC_READ;
    if (HasWriteAccess) accessFlags |= GENERIC_WRITE;

    if (!IsExclusive  ) sharingFlags = FILE_SHARE_READ | FILE_SHARE_WRITE;
    
    HidDevice->HidDevice = CreateFile(DevicePath, accessFlags, sharingFlags, NULL, OPEN_EXISTING, 0, NULL);

    if (HidDevice->HidDevice == INVALID_HANDLE_VALUE) 
    {
        free(HidDevice->DevicePath);
		HidDevice->DevicePath = NULL;

        return FALSE;
    }

    HidDevice->OpenedForRead    = HasReadAccess;
    HidDevice->OpenedForWrite   = HasWriteAccess;
    HidDevice->OpenedOverlapped = IsOverlapped;
    HidDevice->OpenedExclusive  = IsExclusive;
    
    if (!HidD_GetPreparsedData(HidDevice->HidDevice, &HidDevice->Ppd)) 
    {
        free(HidDevice->DevicePath);
		HidDevice->DevicePath = NULL;

        CloseHandle(HidDevice->HidDevice); 
		HidDevice->HidDevice = INVALID_HANDLE_VALUE;

        return FALSE;
    }

    if (!HidD_GetAttributes(HidDevice->HidDevice, &HidDevice->Attributes)) 
    {
        free(HidDevice->DevicePath); 
		HidDevice->DevicePath = NULL;

        CloseHandle(HidDevice->HidDevice); 
		HidDevice->HidDevice = INVALID_HANDLE_VALUE;

        HidD_FreePreparsedData(HidDevice->Ppd); 
		HidDevice->Ppd = NULL;

        return FALSE;
    }

    if (!HidP_GetCaps(HidDevice->Ppd, &HidDevice->Caps))
    {
        free(HidDevice->DevicePath);
		HidDevice->DevicePath = NULL;

        CloseHandle(HidDevice->HidDevice); 
		HidDevice->HidDevice = INVALID_HANDLE_VALUE;

        HidD_FreePreparsedData(HidDevice->Ppd);
		HidDevice->Ppd = NULL;

        return FALSE;
    }

    if (!FillDeviceInfo(HidDevice))
    {
        CloseHidDevice(HidDevice);

        return FALSE;
    }

    if (IsOverlapped)
    {
        CloseHandle(HidDevice->HidDevice);

        HidDevice->HidDevice = CreateFile(DevicePath, accessFlags, sharingFlags, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);

        if (HidDevice->HidDevice == INVALID_HANDLE_VALUE)
        {
            CloseHidDevice(HidDevice);

            return FALSE;
        }
    }

    return TRUE;
}