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;
}