cfgmgr.c
来自「一个类似windows」· C语言 代码 · 共 2,242 行 · 第 1/5 页
C
2,242 行
if (!GuidToString(ClassGuid, pszKeyName))
return CR_INVALID_DATA;
*pulLength = MAX_GUID_STRING_LEN;
return CR_SUCCESS;
}
/***********************************************************************
* CM_Get_Class_NameA [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Get_Class_NameA(
LPGUID ClassGuid, PCHAR Buffer, PULONG pulLength, ULONG ulFlags)
{
TRACE("%p %p %p %lx\n", ClassGuid, Buffer, pulLength, ulFlags);
return CM_Get_Class_Name_ExA(ClassGuid, Buffer, pulLength, ulFlags,
NULL);
}
/***********************************************************************
* CM_Get_Class_NameW [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Get_Class_NameW(
LPGUID ClassGuid, PWCHAR Buffer, PULONG pulLength, ULONG ulFlags)
{
TRACE("%p %p %p %lx\n", ClassGuid, Buffer, pulLength, ulFlags);
return CM_Get_Class_Name_ExW(ClassGuid, Buffer, pulLength, ulFlags,
NULL);
}
/***********************************************************************
* CM_Get_Class_Name_ExA [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Get_Class_Name_ExA(
LPGUID ClassGuid, PCHAR Buffer, PULONG pulLength, ULONG ulFlags,
HMACHINE hMachine)
{
WCHAR szBuffer[MAX_CLASS_NAME_LEN];
CONFIGRET ret = CR_SUCCESS;
ULONG ulLength;
ULONG ulOrigLength;
TRACE("%p %p %p %lx %lx\n",
ClassGuid, Buffer, pulLength, ulFlags, hMachine);
if (ClassGuid == NULL || Buffer == NULL || pulLength == NULL)
return CR_INVALID_POINTER;
ulOrigLength = *pulLength;
*pulLength = 0;
ulLength = MAX_CLASS_NAME_LEN;
ret = CM_Get_Class_Name_ExW(ClassGuid, szBuffer, &ulLength,
ulFlags, hMachine);
if (ret == CR_SUCCESS)
{
if (WideCharToMultiByte(CP_ACP,
0,
szBuffer,
ulLength,
Buffer,
ulOrigLength,
NULL,
NULL) == 0)
ret = CR_FAILURE;
else
*pulLength = lstrlenA(Buffer) + 1;
}
return ret;
}
/***********************************************************************
* CM_Get_Class_Name_ExW [SETUPAPI.@]
*/
CONFIGRET WINAPI
CM_Get_Class_Name_ExW(
LPGUID ClassGuid, PWCHAR Buffer, PULONG pulLength, ULONG ulFlags,
HMACHINE hMachine)
{
WCHAR szGuidString[MAX_GUID_STRING_LEN];
RPC_BINDING_HANDLE BindingHandle = NULL;
TRACE("%p %p %p %lx %lx\n",
ClassGuid, Buffer, pulLength, ulFlags, hMachine);
if (ClassGuid == NULL || Buffer == NULL || pulLength == NULL)
return CR_INVALID_POINTER;
if (ulFlags != 0)
return CR_INVALID_FLAG;
if (!GuidToString(ClassGuid, szGuidString))
return CR_INVALID_DATA;
TRACE("Guid %s\n", debugstr_w(szGuidString));
if (hMachine != NULL)
{
BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
if (BindingHandle == NULL)
return CR_FAILURE;
}
else
{
if (!PnpGetLocalHandles(&BindingHandle, NULL))
return CR_FAILURE;
}
return PNP_GetClassName(BindingHandle,
szGuidString,
Buffer,
pulLength,
ulFlags);
}
/***********************************************************************
* CM_Get_Depth [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Get_Depth(
PULONG pulDepth, DEVINST dnDevInst, ULONG ulFlags)
{
TRACE("%p %lx %lx\n", pulDepth, dnDevInst, ulFlags);
return CM_Get_Depth_Ex(pulDepth, dnDevInst, ulFlags, NULL);
}
/***********************************************************************
* CM_Get_Depth_Ex [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Get_Depth_Ex(
PULONG pulDepth, DEVINST dnDevInst, ULONG ulFlags, HMACHINE hMachine)
{
RPC_BINDING_HANDLE BindingHandle = NULL;
HSTRING_TABLE StringTable = NULL;
LPWSTR lpDevInst;
TRACE("%p %lx %lx %lx\n",
pulDepth, dnDevInst, ulFlags, hMachine);
if (pulDepth == NULL)
return CR_INVALID_POINTER;
if (dnDevInst == 0)
return CR_INVALID_DEVINST;
if (ulFlags != 0)
return CR_INVALID_FLAG;
if (hMachine != NULL)
{
BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
if (BindingHandle == NULL)
return CR_FAILURE;
StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
if (StringTable == 0)
return CR_FAILURE;
}
else
{
if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
return CR_FAILURE;
}
lpDevInst = StringTableStringFromId(StringTable, dnDevInst);
if (lpDevInst == NULL)
return CR_INVALID_DEVNODE;
return PNP_GetDepth(BindingHandle,
lpDevInst,
pulDepth,
ulFlags);
}
/***********************************************************************
* CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Get_DevNode_Registry_PropertyA(
DEVINST dnDevInst, ULONG ulProperty, PULONG pulRegDataType,
PVOID Buffer, PULONG pulLength, ULONG ulFlags)
{
TRACE("%lx %lu %p %p %p %lx\n",
dnDevInst, ulProperty, pulRegDataType, Buffer, pulLength, ulFlags);
return CM_Get_DevNode_Registry_Property_ExA(dnDevInst, ulProperty,
pulRegDataType, Buffer,
pulLength, ulFlags, NULL);
}
/***********************************************************************
* CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Get_DevNode_Registry_PropertyW(
DEVINST dnDevInst, ULONG ulProperty, PULONG pulRegDataType,
PVOID Buffer, PULONG pulLength, ULONG ulFlags)
{
TRACE("%lx %lu %p %p %p %lx\n",
dnDevInst, ulProperty, pulRegDataType, Buffer, pulLength, ulFlags);
return CM_Get_DevNode_Registry_Property_ExW(dnDevInst, ulProperty,
pulRegDataType, Buffer,
pulLength, ulFlags, NULL);
}
/***********************************************************************
* CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Get_DevNode_Registry_Property_ExA(
DEVINST dnDevInst, ULONG ulProperty, PULONG pulRegDataType,
PVOID Buffer, PULONG pulLength, ULONG ulFlags, HMACHINE hMachine)
{
PVOID BufferW;
ULONG LengthW;
ULONG RegDataType = REG_NONE;
CONFIGRET ret;
TRACE("%lx %lu %p %p %p %lx %lx\n",
dnDevInst, ulProperty, pulRegDataType, Buffer, pulLength,
ulFlags, hMachine);
if (!pulLength)
return CR_INVALID_POINTER;
LengthW = *pulLength * sizeof(WCHAR);
BufferW = HeapAlloc(GetProcessHeap(), 0, LengthW);
if (!BufferW)
return CR_OUT_OF_MEMORY;
ret = CM_Get_DevNode_Registry_Property_ExW(dnDevInst,
ulProperty,
&RegDataType,
BufferW,
&LengthW,
ulFlags,
hMachine);
if (ret == CR_SUCCESS)
{
if (RegDataType == REG_SZ || RegDataType == REG_EXPAND_SZ)
{
/* Do W->A conversion */
*pulLength = WideCharToMultiByte(CP_ACP,
0,
BufferW,
lstrlenW(BufferW) + 1,
Buffer,
*pulLength,
NULL,
NULL);
if (*pulLength == 0)
ret = CR_FAILURE;
}
else
{
/* Directly copy the value */
if (LengthW <= *pulLength)
memcpy(Buffer, BufferW, LengthW);
else
{
*pulLength = LengthW;
ret = CR_BUFFER_SMALL;
}
}
}
if (pulRegDataType)
*pulRegDataType = RegDataType;
HeapFree(GetProcessHeap(), 0, BufferW);
return ret;
}
/***********************************************************************
* CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Get_DevNode_Registry_Property_ExW(
DEVINST dnDevInst, ULONG ulProperty, PULONG pulRegDataType,
PVOID Buffer, PULONG pulLength, ULONG ulFlags, HMACHINE hMachine)
{
RPC_BINDING_HANDLE BindingHandle = NULL;
HSTRING_TABLE StringTable = NULL;
CONFIGRET ret = CR_SUCCESS;
LPWSTR lpDevInst;
ULONG ulDataType = 0;
ULONG ulTransferLength = 0;
TRACE("%lx %lu %p %p %p %lx %lx\n",
dnDevInst, ulProperty, pulRegDataType, Buffer, pulLength,
ulFlags, hMachine);
if (dnDevInst == 0)
return CR_INVALID_DEVNODE;
if (ulProperty < CM_DRP_MIN || ulProperty > CM_DRP_MAX)
return CR_INVALID_PROPERTY;
/* pulRegDataType is optional */
/* Buffer is optional */
if (pulLength == NULL)
return CR_INVALID_POINTER;
if (*pulLength == 0)
return CR_INVALID_POINTER;
if (ulFlags != 0)
return CR_INVALID_FLAG;
if (hMachine != NULL)
{
BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
if (BindingHandle == NULL)
return CR_FAILURE;
StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
if (StringTable == 0)
return CR_FAILURE;
}
else
{
if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
return CR_FAILURE;
}
lpDevInst = StringTableStringFromId(StringTable, dnDevInst);
if (lpDevInst == NULL)
return CR_INVALID_DEVNODE;
ulTransferLength = *pulLength;
ret = PNP_GetDeviceRegProp(BindingHandle,
lpDevInst,
ulProperty,
&ulDataType,
Buffer,
&ulTransferLength,
pulLength,
ulFlags);
if (ret == CR_SUCCESS)
{
if (pulRegDataType != NULL)
*pulRegDataType = ulDataType;
}
return ret;
}
/***********************************************************************
* CM_Get_DevNode_Status [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Get_DevNode_Status(
PULONG pulStatus, PULONG pulProblemNumber, DEVINST dnDevInst,
ULONG ulFlags)
{
TRACE("%p %p %lx %lx\n",
pulStatus, pulProblemNumber, dnDevInst, ulFlags);
return CM_Get_DevNode_Status_Ex(pulStatus, pulProblemNumber, dnDevInst,
ulFlags, NULL);
}
/***********************************************************************
* CM_Get_DevNode_Status_Ex [SETUPAPI.@]
*/
CONFIGRET WINAPI
CM_Get_DevNode_Status_Ex(
PULONG pulStatus, PULONG pulProblemNumber, DEVINST dnDevInst,
ULONG ulFlags, HMACHINE hMachine)
{
RPC_BINDING_HANDLE BindingHandle = NULL;
HSTRING_TABLE StringTable = NULL;
LPWSTR lpDevInst;
TRACE("%p %p %lx %lx %lx\n",
pulStatus, pulProblemNumber, dnDevInst, ulFlags, hMachine);
if (pulStatus == NULL || pulProblemNumber == NULL)
return CR_INVALID_POINTER;
if (dnDevInst == 0)
return CR_INVALID_DEVINST;
if (ulFlags != 0)
return CR_INVALID_FLAG;
if (hMachine != NULL)
{
BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
if (BindingHandle == NULL)
return CR_FAILURE;
StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
if (StringTable == 0)
return CR_FAILURE;
}
else
{
if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
return CR_FAILURE;
}
lpDevInst = StringTableStringFromId(StringTable, dnDevInst);
if (lpDevInst == NULL)
return CR_INVALID_DEVNODE;
return PNP_GetDeviceStatus(BindingHandle,
lpDevInst,
pulStatus,
pulProblemNumber,
ulFlags);
}
/***********************************************************************
* CM_Get_Device_IDA [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Get_Device_IDA(
DEVINST dnDevInst, PCHAR Buffer, ULONG BufferLen, ULONG ulFlags)
{
TRACE("%lx %p %ld %ld\n",
dnDevInst, Buffer, BufferLen, ulFlags);
return CM_Get_Device_ID_ExA(dnDevInst, Buffer, BufferLen, ulFlags, NULL);
}
/***********************************************************************
* CM_Get_Device_IDW [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Get_Device_IDW(
DEVINST dnDevInst, PWCHAR Buffer, ULONG BufferLen, ULONG ulFlags)
{
TRACE("%lx %p %ld %ld\n",
dnDevInst, Buffer, BufferLen, ulFlags);
return CM_Get_Device_ID_ExW(dnDevInst, Buffer, BufferLen, ulFlags, NULL);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?