cfgmgr.c
来自「一个类似windows」· C语言 代码 · 共 2,242 行 · 第 1/5 页
C
2,242 行
/***********************************************************************
* CM_Get_Sibling [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Get_Sibling(
PDEVINST pdnDevInst, DEVINST dnDevInst, ULONG ulFlags)
{
TRACE("%p %p %lx\n", pdnDevInst, dnDevInst, ulFlags);
return CM_Get_Sibling_Ex(pdnDevInst, dnDevInst, ulFlags, NULL);
}
/***********************************************************************
* CM_Get_Sibling_Ex [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Get_Sibling_Ex(
PDEVINST pdnDevInst, DEVINST dnDevInst, ULONG ulFlags, HMACHINE hMachine)
{
WCHAR szRelatedDevInst[MAX_DEVICE_ID_LEN];
RPC_BINDING_HANDLE BindingHandle = NULL;
HSTRING_TABLE StringTable = NULL;
LPWSTR lpDevInst;
DWORD dwIndex;
CONFIGRET ret;
TRACE("%p %lx %lx %lx\n", pdnDevInst, dnDevInst, ulFlags, hMachine);
if (pdnDevInst == NULL)
return CR_INVALID_POINTER;
if (dnDevInst == 0)
return CR_INVALID_DEVINST;
if (ulFlags != 0)
return CR_INVALID_FLAG;
*pdnDevInst = -1;
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;
ret = PNP_GetRelatedDeviceInstance(BindingHandle,
PNP_DEVICE_SIBLING,
lpDevInst,
szRelatedDevInst,
MAX_DEVICE_ID_LEN,
0);
if (ret != CR_SUCCESS)
return ret;
TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst));
dwIndex = StringTableAddString(StringTable, szRelatedDevInst, 1);
if (dwIndex == -1)
return CR_FAILURE;
*pdnDevInst = dwIndex;
return CR_SUCCESS;
}
/***********************************************************************
* CM_Get_Version [SETUPAPI.@]
*/
WORD WINAPI CM_Get_Version(VOID)
{
TRACE("\n");
return CM_Get_Version_Ex(NULL);
}
/***********************************************************************
* CM_Get_Version_Ex [SETUPAPI.@]
*/
WORD WINAPI CM_Get_Version_Ex(HMACHINE hMachine)
{
RPC_BINDING_HANDLE BindingHandle = NULL;
WORD Version = 0;
TRACE("%lx\n", hMachine);
if (hMachine != NULL)
{
BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
if (BindingHandle == NULL)
return 0;
}
else
{
if (!PnpGetLocalHandles(&BindingHandle, NULL))
return CR_FAILURE;
}
if (PNP_GetVersion(BindingHandle, &Version) != CR_SUCCESS)
return 0;
return Version;
}
/***********************************************************************
* CM_Is_Dock_Station_Present [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Is_Dock_Station_Present(
PBOOL pbPresent)
{
TRACE("%p\n", pbPresent);
return CM_Is_Dock_Station_Present_Ex(pbPresent, NULL);
}
/***********************************************************************
* CM_Is_Dock_Station_Present_Ex [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Is_Dock_Station_Present_Ex(
PBOOL pbPresent, HMACHINE hMachine)
{
RPC_BINDING_HANDLE BindingHandle = NULL;
TRACE("%p %lx\n", pbPresent, hMachine);
if (pbPresent == NULL)
return CR_INVALID_POINTER;
*pbPresent = FALSE;
if (hMachine != NULL)
{
BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
if (BindingHandle == NULL)
return CR_FAILURE;
}
else
{
if (!PnpGetLocalHandles(&BindingHandle, NULL))
return CR_FAILURE;
}
return PNP_IsDockStationPresent(BindingHandle,
(unsigned long *)pbPresent);
}
/***********************************************************************
* CM_Locate_DevNodeA [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Locate_DevNodeA(
PDEVINST pdnDevInst, DEVINSTID_A pDeviceID, ULONG ulFlags)
{
TRACE("%p %s %lu\n", pdnDevInst, pDeviceID, ulFlags);
return CM_Locate_DevNode_ExA(pdnDevInst, pDeviceID, ulFlags, NULL);
}
/***********************************************************************
* CM_Locate_DevNodeW [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Locate_DevNodeW(
PDEVINST pdnDevInst, DEVINSTID_W pDeviceID, ULONG ulFlags)
{
TRACE("%p %s %lu\n", pdnDevInst, debugstr_w(pDeviceID), ulFlags);
return CM_Locate_DevNode_ExW(pdnDevInst, pDeviceID, ulFlags, NULL);
}
/***********************************************************************
* CM_Locate_DevNode_ExA [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Locate_DevNode_ExA(
PDEVINST pdnDevInst, DEVINSTID_A pDeviceID, ULONG ulFlags, HMACHINE hMachine)
{
DEVINSTID_W pDevIdW = NULL;
CONFIGRET ret = CR_SUCCESS;
TRACE("%p %s %lu %lx\n", pdnDevInst, pDeviceID, ulFlags, hMachine);
if (pDeviceID != NULL)
{
if (CaptureAndConvertAnsiArg(pDeviceID, &pDevIdW))
return CR_INVALID_DEVICE_ID;
}
ret = CM_Locate_DevNode_ExW(pdnDevInst, pDevIdW, ulFlags, hMachine);
if (pDevIdW != NULL)
MyFree(pDevIdW);
return ret;
}
/***********************************************************************
* CM_Locate_DevNode_ExW [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Locate_DevNode_ExW(
PDEVINST pdnDevInst, DEVINSTID_W pDeviceID, ULONG ulFlags, HMACHINE hMachine)
{
WCHAR DeviceIdBuffer[MAX_DEVICE_ID_LEN];
RPC_BINDING_HANDLE BindingHandle = NULL;
HSTRING_TABLE StringTable = NULL;
CONFIGRET ret = CR_SUCCESS;
TRACE("%p %s %lu %lx\n", pdnDevInst, debugstr_w(pDeviceID), ulFlags, hMachine);
if (pdnDevInst == NULL)
return CR_INVALID_POINTER;
if (ulFlags & ~CM_LOCATE_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;
}
if (pDeviceID != NULL && lstrlenW(pDeviceID) != 0)
{
lstrcpyW(DeviceIdBuffer, pDeviceID);
}
else
{
/* Get the root device ID */
ret = PNP_GetRootDeviceInstance(BindingHandle,
DeviceIdBuffer,
MAX_DEVICE_ID_LEN);
if (ret != CR_SUCCESS)
return CR_FAILURE;
}
TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer));
/* Validate the device ID */
ret = PNP_ValidateDeviceInstance(BindingHandle,
DeviceIdBuffer,
ulFlags);
if (ret == CR_SUCCESS)
{
*pdnDevInst = StringTableAddString(StringTable, DeviceIdBuffer, 1);
if (*pdnDevInst == -1)
ret = CR_FAILURE;
}
return ret;
}
/***********************************************************************
* CM_Move_DevNode [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Move_DevNode(
DEVINST dnFromDevInst, DEVINST dnToDevInst, ULONG ulFlags)
{
TRACE("%lx %lx %lx\n", dnFromDevInst, dnToDevInst, ulFlags);
return CM_Move_DevNode_Ex(dnFromDevInst, dnToDevInst, ulFlags, NULL);
}
/***********************************************************************
* CM_Move_DevNode_Ex [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Move_DevNode_Ex(
DEVINST dnFromDevInst, DEVINST dnToDevInst, ULONG ulFlags,
HMACHINE hMachine)
{
RPC_BINDING_HANDLE BindingHandle = NULL;
HSTRING_TABLE StringTable = NULL;
LPWSTR lpFromDevInst;
LPWSTR lpToDevInst;
FIXME("%lx %lx %lx %lx\n",
dnFromDevInst, dnToDevInst, ulFlags, hMachine);
if (!IsUserAdmin())
return CR_ACCESS_DENIED;
if (dnFromDevInst == 0 || dnToDevInst == 0)
return CR_INVALID_DEVNODE;
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;
}
lpFromDevInst = StringTableStringFromId(StringTable, dnFromDevInst);
if (lpFromDevInst == NULL)
return CR_INVALID_DEVNODE;
lpToDevInst = StringTableStringFromId(StringTable, dnToDevInst);
if (lpToDevInst == NULL)
return CR_INVALID_DEVNODE;
return PNP_DeviceInstanceAction(BindingHandle,
2,
ulFlags,
lpFromDevInst,
lpToDevInst);
}
/***********************************************************************
* CM_Open_Class_KeyA [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Open_Class_KeyA(
LPGUID pClassGuid, LPCSTR pszClassName, REGSAM samDesired,
REGDISPOSITION Disposition, PHKEY phkClass, ULONG ulFlags)
{
TRACE("%p %s %lx %lx %p %lx\n",
debugstr_guid(pClassGuid), pszClassName,
samDesired, Disposition, phkClass, ulFlags);
return CM_Open_Class_Key_ExA(pClassGuid, pszClassName, samDesired,
Disposition, phkClass, ulFlags, NULL);
}
/***********************************************************************
* CM_Open_Class_KeyW [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Open_Class_KeyW(
LPGUID pClassGuid, LPCWSTR pszClassName, REGSAM samDesired,
REGDISPOSITION Disposition, PHKEY phkClass, ULONG ulFlags)
{
TRACE("%p %s %lx %lx %p %lx\n",
debugstr_guid(pClassGuid), debugstr_w(pszClassName),
samDesired, Disposition, phkClass, ulFlags);
return CM_Open_Class_Key_ExW(pClassGuid, pszClassName, samDesired,
Disposition, phkClass, ulFlags, NULL);
}
/***********************************************************************
* CM_Open_Class_Key_ExA [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Open_Class_Key_ExA(
LPGUID pClassGuid, LPCSTR pszClassName, REGSAM samDesired,
REGDISPOSITION Disposition, PHKEY phkClass, ULONG ulFlags,
HMACHINE hMachine)
{
CONFIGRET rc = CR_SUCCESS;
LPWSTR pszClassNameW = NULL;
TRACE("%p %s %lx %lx %p %lx %lx\n",
debugstr_guid(pClassGuid), pszClassName,
samDesired, Disposition, phkClass, ulFlags, hMachine);
if (pszClassName != NULL)
{
if (CaptureAndConvertAnsiArg(pszClassName, &pszClassNameW))
return CR_INVALID_DATA;
}
rc = CM_Open_Class_Key_ExW(pClassGuid, pszClassNameW, samDesired,
Disposition, phkClass, ulFlags, hMachine);
if (pszClassNameW != NULL)
MyFree(pszClassNameW);
return CR_SUCCESS;
}
/***********************************************************************
* CM_Open_Class_Key_ExW [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Open_Class_Key_ExW(
LPGUID pClassGuid, LPCWSTR pszClassName, REGSAM samDesired,
REGDISPOSITION Disposition, PHKEY phkClass, ULONG ulFlags,
HMACHINE hMachine)
{
WCHAR szKeyName[MAX_PATH];
LPWSTR lpGuidString;
DWORD dwDisposition;
DWORD dwError;
HKEY hKey;
TRACE("%p %s %lx %lx %p %lx %lx\n",
debugstr_guid(pClassGuid), debugstr_w(pszClassName),
samDesired, Disposition, phkClass, ulFlags, hMachine);
/* Check Disposition and ulFlags */
if ((Disposition & ~RegDisposition_Bits) ||
(ulFlags & ~CM_OPEN_CLASS_KEY_BITS))
return CR_INVALID_FLAG;
/* Check phkClass */
if (phkClass == NULL)
return CR_INVALID_POINTER;
*phkClass = NULL;
if (ulFlags == CM_OPEN_CLASS_KEY_INTERFACE &&
pszClassName != NULL)
return CR_INVALID_DATA;
if (hMachine == NULL)
{
hKey = HKEY_LOCAL_MACHINE;
}
else
{
if (RegConnectRegistryW(((PMACHINE_INFO)hMachine)->szMachineName,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?