📄 cfgmgr.c
字号:
}
/***********************************************************************
* CM_Create_DevNode_ExA [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Create_DevNode_ExA(
PDEVINST pdnDevInst, DEVINSTID_A pDeviceID, DEVINST dnParent,
ULONG ulFlags, HANDLE hMachine)
{
DEVINSTID_W pDeviceIDW;
CONFIGRET ret;
TRACE("%p %s %p %lx %p\n",
pdnDevInst, debugstr_a(pDeviceID), dnParent, ulFlags, hMachine);
if (CaptureAndConvertAnsiArg(pDeviceID, &pDeviceIDW))
return CR_INVALID_DATA;
ret = CM_Create_DevNode_ExW(pdnDevInst, pDeviceIDW, dnParent, ulFlags,
hMachine);
MyFree(pDeviceIDW);
return ret;
}
/***********************************************************************
* CM_Create_DevNode_ExW [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Create_DevNode_ExW(
PDEVINST pdnDevInst, DEVINSTID_W pDeviceID, DEVINST dnParent,
ULONG ulFlags, HANDLE hMachine)
{
RPC_BINDING_HANDLE BindingHandle = NULL;
HSTRING_TABLE StringTable = NULL;
LPWSTR lpParentDevInst;
CONFIGRET ret = CR_SUCCESS;
FIXME("%p %s %p %lx %p\n",
pdnDevInst, debugstr_w(pDeviceID), dnParent, ulFlags, hMachine);
if (!IsUserAdmin())
return CR_ACCESS_DENIED;
if (pdnDevInst == NULL)
return CR_INVALID_POINTER;
if (pDeviceID == NULL || wcslen(pDeviceID) == 0)
return CR_INVALID_DEVICE_ID;
if (dnParent == 0)
return CR_INVALID_DEVNODE;
if (ulFlags & ~CM_CREATE_DEVNODE_BITS)
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;
}
lpParentDevInst = StringTableStringFromId(StringTable, dnParent);
if (lpParentDevInst == NULL)
return CR_INVALID_DEVNODE;
ret = PNP_CreateDevInst(BindingHandle,
pDeviceID,
lpParentDevInst,
MAX_DEVICE_ID_LEN,
ulFlags);
if (ret == CR_SUCCESS)
{
*pdnDevInst = StringTableAddString(StringTable, pDeviceID, 1);
if (*pdnDevInst == 0)
ret = CR_NO_SUCH_DEVNODE;
}
return ret;
}
/***********************************************************************
* CM_Delete_Class_Key [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Delete_Class_Key(
LPGUID ClassGuid, ULONG ulFlags)
{
TRACE("%p %lx\n", ClassGuid, ulFlags);
return CM_Delete_Class_Key_Ex(ClassGuid, ulFlags, NULL);
}
/***********************************************************************
* CM_Delete_Class_Key_Ex [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Delete_Class_Key_Ex(
LPGUID ClassGuid, ULONG ulFlags, HANDLE hMachine)
{
WCHAR szGuidString[MAX_GUID_STRING_LEN];
RPC_BINDING_HANDLE BindingHandle = NULL;
TRACE("%p %lx %lx\n", ClassGuid, ulFlags, hMachine);
if (ClassGuid == NULL)
return CR_INVALID_POINTER;
if (ulFlags & ~CM_DELETE_CLASS_BITS)
return CR_INVALID_FLAG;
if (!GuidToString(ClassGuid, szGuidString))
return CR_INVALID_DATA;
if (hMachine != NULL)
{
BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
if (BindingHandle == NULL)
return CR_FAILURE;
}
else
{
if (!PnpGetLocalHandles(&BindingHandle, NULL))
return CR_FAILURE;
}
return PNP_DeleteClassKey(BindingHandle,
szGuidString,
ulFlags);
}
/***********************************************************************
* CM_Delete_DevNode_Key [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Delete_DevNode_Key(
DEVNODE dnDevNode, ULONG ulHardwareProfile, ULONG ulFlags)
{
TRACE("%p %lu %lx\n", dnDevNode, ulHardwareProfile, ulFlags);
return CM_Delete_DevNode_Key_Ex(dnDevNode, ulHardwareProfile, ulFlags,
NULL);
}
/***********************************************************************
* CM_Delete_DevNode_Key_Ex [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Delete_DevNode_Key_Ex(
DEVNODE dnDevNode, ULONG ulHardwareProfile, ULONG ulFlags,
HANDLE hMachine)
{
FIXME("%p %lu %lx %p\n",
dnDevNode, ulHardwareProfile, ulFlags, hMachine);
return CR_CALL_NOT_IMPLEMENTED;
}
/***********************************************************************
* CM_Disable_DevNode [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Disable_DevNode(
DEVINST dnDevInst, ULONG ulFlags)
{
TRACE("%p %lx\n", dnDevInst, ulFlags);
return CM_Disable_DevNode_Ex(dnDevInst, ulFlags, NULL);
}
/***********************************************************************
* CM_Disable_DevNode_Ex [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Disable_DevNode_Ex(
DEVINST dnDevInst, ULONG ulFlags, HMACHINE hMachine)
{
RPC_BINDING_HANDLE BindingHandle = NULL;
HSTRING_TABLE StringTable = NULL;
LPWSTR lpDevInst;
FIXME("%p %lx %p\n", dnDevInst, ulFlags, hMachine);
if (!IsUserAdmin())
return CR_ACCESS_DENIED;
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_DeviceInstanceAction(BindingHandle,
5,
ulFlags,
lpDevInst,
NULL);
}
/***********************************************************************
* CM_Disconnect_Machine [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Disconnect_Machine(HMACHINE hMachine)
{
PMACHINE_INFO pMachine;
TRACE("%lx\n", hMachine);
pMachine = (PMACHINE_INFO)hMachine;
if (pMachine == NULL)
return CR_SUCCESS;
if (pMachine->bLocal == FALSE)
{
if (pMachine->StringTable != NULL)
StringTableDestroy(pMachine->StringTable);
if (!PnpUnbindRpc(pMachine->BindingHandle))
return CR_ACCESS_DENIED;
}
HeapFree(GetProcessHeap(), 0, pMachine);
return CR_SUCCESS;
}
/***********************************************************************
* CM_Enable_DevNode [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Enable_DevNode(
DEVINST dnDevInst, ULONG ulFlags)
{
TRACE("%p %lx\n", dnDevInst, ulFlags);
return CM_Enable_DevNode_Ex(dnDevInst, ulFlags, NULL);
}
/***********************************************************************
* CM_Enable_DevNode_Ex [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Enable_DevNode_Ex(
DEVINST dnDevInst, ULONG ulFlags, HMACHINE hMachine)
{
RPC_BINDING_HANDLE BindingHandle = NULL;
HSTRING_TABLE StringTable = NULL;
LPWSTR lpDevInst;
FIXME("%p %lx %p\n", dnDevInst, ulFlags, hMachine);
if (!IsUserAdmin())
return CR_ACCESS_DENIED;
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_DeviceInstanceAction(BindingHandle,
4,
ulFlags,
lpDevInst,
NULL);
}
/***********************************************************************
* CM_Enumerate_Classes [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Enumerate_Classes(
ULONG ulClassIndex, LPGUID ClassGuid, ULONG ulFlags)
{
TRACE("%lx %p %lx\n", ulClassIndex, ClassGuid, ulFlags);
return CM_Enumerate_Classes_Ex(ulClassIndex, ClassGuid, ulFlags, NULL);
}
/***********************************************************************
* CM_Enumerate_Classes_Ex [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Enumerate_Classes_Ex(
ULONG ulClassIndex, LPGUID ClassGuid, ULONG ulFlags, HMACHINE hMachine)
{
WCHAR szBuffer[MAX_GUID_STRING_LEN];
RPC_BINDING_HANDLE BindingHandle = NULL;
CONFIGRET ret = CR_SUCCESS;
ULONG ulLength = MAX_GUID_STRING_LEN;
TRACE("%lx %p %lx %p\n", ulClassIndex, ClassGuid, ulFlags, hMachine);
if (ClassGuid == NULL)
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;
}
else
{
if (!PnpGetLocalHandles(&BindingHandle, NULL))
return CR_FAILURE;
}
ret = PNP_EnumerateSubKeys(BindingHandle,
PNP_BRANCH_CLASS,
ulClassIndex,
szBuffer,
MAX_GUID_STRING_LEN,
&ulLength,
ulFlags);
if (ret == CR_SUCCESS)
{
/* Remove the {} */
szBuffer[MAX_GUID_STRING_LEN - 2] = UNICODE_NULL;
/* Convert the buffer to a GUID */
if (UuidFromStringW(&szBuffer[1], ClassGuid) != RPC_S_OK)
return CR_FAILURE;
}
return ret;
}
/***********************************************************************
* CM_Enumerate_EnumeratorsA [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Enumerate_EnumeratorsA(
ULONG ulEnumIndex, PCHAR Buffer, PULONG pulLength, ULONG ulFlags)
{
TRACE("%lu %p %p %lx\n", ulEnumIndex, Buffer, pulLength, ulFlags);
return CM_Enumerate_Enumerators_ExA(ulEnumIndex, Buffer, pulLength,
ulFlags, NULL);
}
/***********************************************************************
* CM_Enumerate_EnumeratorsW [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Enumerate_EnumeratorsW(
ULONG ulEnumIndex, PWCHAR Buffer, PULONG pulLength, ULONG ulFlags)
{
TRACE("%lu %p %p %lx\n", ulEnumIndex, Buffer, pulLength, ulFlags);
return CM_Enumerate_Enumerators_ExW(ulEnumIndex, Buffer, pulLength,
ulFlags, NULL);
}
/***********************************************************************
* CM_Enumerate_Enumerators_ExA [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Enumerate_Enumerators_ExA(
ULONG ulEnumIndex, PCHAR Buffer, PULONG pulLength, ULONG ulFlags,
HMACHINE hMachine)
{
WCHAR szBuffer[MAX_DEVICE_ID_LEN];
ULONG ulOrigLength;
ULONG ulLength;
CONFIGRET ret = CR_SUCCESS;
TRACE("%lu %p %p %lx %lx\n", ulEnumIndex, Buffer, pulLength, ulFlags,
hMachine);
if (Buffer == NULL || pulLength == NULL)
return CR_INVALID_POINTER;
if (ulFlags != 0)
return CR_INVALID_FLAG;
ulOrigLength = *pulLength;
*pulLength = 0;
ulLength = MAX_DEVICE_ID_LEN;
ret = CM_Enumerate_Enumerators_ExW(ulEnumIndex, 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;
}
/***********************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -