- Add stubs: CM_GetChild, CM_GetChild_Ex, CM_GetParent, CM_GetPaarent_Ex, CM_GetSibling, CM_GetSibling_Ex, CM_Locate_DevNodeA, CM_Locate_DevNodeW, CM_Locate_DevNode_ExA, CM_Locate_DevNode_ExW

- Implement:  CM_GetVersion, CM_GetVersion_Ex, CM_Connect_MachineA, CM_Connect_MachineW, CM_Disconnect_Machine.
- Implement RPC server in umpnpmgr.dll to reply to calls to CM_GetVersion/CM_GetVersion_Ex.

svn path=/trunk/; revision=14235
This commit is contained in:
Eric Kohl 2005-03-20 20:43:46 +00:00
parent a0da8855ea
commit b718e3cc4e
11 changed files with 444 additions and 31 deletions

View file

@ -0,0 +1,19 @@
/*
* Plug and Play Manager interface definition
*/
#define WORD unsigned short
[
uuid (809F4e40-A03D-11CE-8F69-08003E30051B),
version(1.0),
pointer_default(unique),
explicit_handle
]
interface pnp
{
// unsigned long PNP_GetRootDeviceInstance(handle_t BindingHandle,
// [out, string, size_is(Length)] wchar_t *DeviceInstance,
// [in] unsigned long Length);
WORD PNP_GetVersion(handle_t BindingHandle);
}

View file

@ -19,13 +19,29 @@
#ifndef _CFGMGR32_H_
#define _CFGMGR32_H_
/* cfgmgr32 doesn't use the normal convention, it adds an underscore before A/W */
#ifdef __WINESRC__
# define DECL_WINELIB_CFGMGR32_TYPE_AW(type) /* nothing */
#else /* __WINESRC__ */
# define DECL_WINELIB_CFGMGR32_TYPE_AW(type) typedef WINELIB_NAME_AW(type##_) type;
#endif /* __WINESRC__ */
typedef DWORD CONFIGRET;
typedef HANDLE HMACHINE;
typedef HMACHINE *PHMACHINE;
typedef DWORD DEVINST;
typedef DEVINST *PDEVINST;
#define CR_SUCCESS 0x00000000
#define CR_INVALID_DATA 0x0000001F
#define CR_ACCESS_DENIED 0x00000033
typedef CHAR *DEVINSTID_A;
typedef WCHAR *DEVINSTID_W;
DECL_WINELIB_CFGMGR32_TYPE_AW(DEVINSTID)
#define CR_SUCCESS 0x00000000
#define CR_OUT_OF_MEMORY 0x00000002
#define CR_INVALID_DATA 0x0000001F
#define CR_INVALID_MACHINENAME 0x0000002F
#define CR_ACCESS_DENIED 0x00000033
CONFIGRET WINAPI CM_Connect_MachineA( PCSTR, PHMACHINE );
@ -34,6 +50,8 @@ CONFIGRET WINAPI CM_Connect_MachineW( PCWSTR, PHMACHINE );
CONFIGRET WINAPI CM_Disconnect_Machine( HMACHINE );
CONFIGRET WINAPI CM_Get_Child( PDEVINST, DEVINST, ULONG );
CONFIGRET WINAPI CM_Get_Child_Ex( PDEVINST, DEVINST, ULONG, HMACHINE );
CONFIGRET WINAPI CM_Get_Device_ID_ListA( PCSTR, PCHAR, ULONG, ULONG );
CONFIGRET WINAPI CM_Get_Device_ID_ListW( PCWSTR, PWCHAR, ULONG, ULONG );
#define CM_Get_Device_ID_List WINELIB_NAME_AW(CM_Get_Device_ID_List)
@ -46,5 +64,18 @@ CONFIGRET WINAPI CM_Get_Device_ID_List_SizeW( PULONG, PCWSTR, ULONG );
CONFIGRET WINAPI CM_Get_Device_ID_List_Size_ExA( PULONG, PCSTR, ULONG, HMACHINE );
CONFIGRET WINAPI CM_Get_Device_ID_List_Size_ExW( PULONG, PCWSTR, ULONG, HMACHINE );
#define CM_Get_Device_ID_List_Size_Ex WINELIB_NAME_AW(CM_Get_Device_ID_List_Size_Ex)
CONFIGRET WINAPI CM_Get_Parent( PDEVINST, DEVINST, ULONG );
CONFIGRET WINAPI CM_Get_Parent_Ex( PDEVINST, DEVINST, ULONG, HMACHINE );
CONFIGRET WINAPI CM_Get_Sibling( PDEVINST, DEVINST, ULONG );
CONFIGRET WINAPI CM_Get_Sibling_Ex( PDEVINST, DEVINST, ULONG, HMACHINE );
WORD WINAPI CM_Get_Version( VOID );
WORD WINAPI CM_Get_Version_Ex( HMACHINE );
CONFIGRET WINAPI CM_Locate_DevNodeA(PDEVINST, DEVINSTID_A, ULONG);
CONFIGRET WINAPI CM_Locate_DevNodeW(PDEVINST, DEVINSTID_W, ULONG);
#define CM_Locate_DevNode WINELIB_NAME_AW(CM_Locate_DevNode)
CONFIGRET WINAPI CM_Locate_DevNode_ExA(PDEVINST, DEVINSTID_A, ULONG, HMACHINE);
CONFIGRET WINAPI CM_Locate_DevNode_ExW(PDEVINST, DEVINSTID_W, ULONG, HMACHINE);
#define CM_Locate_DevNode_Ex WINELIB_NAME_AW(CM_Locate_DevNode_Ex)
#endif /* _CFGMGR32_H_ */

View file

@ -666,6 +666,8 @@ DECL_WINELIB_SETUPAPI_TYPE_AW(PFILEPATHS)
LONG WINAPI AddTagToGroupOrderList(PCWSTR lpGroupName, DWORD dwUnknown2, DWORD dwUnknown3);
DWORD WINAPI CaptureAndConvertAnsiArg(PCSTR lpSrc, PWSTR *lpDst);
DWORD WINAPI CaptureStringArg(PCWSTR lpSrc, PWSTR *lpDst);
BOOL WINAPI DelayedMove(PCWSTR lpExistingFileName, PCWSTR lpNewFileName);
BOOL WINAPI DoesUserHavePrivilege(PCWSTR lpPrivilegeName);
PWSTR WINAPI DuplicateString(PCWSTR lpSrc);

View file

@ -18,7 +18,9 @@ C_SRCS = \
parser.c \
queue.c \
setupcab.c \
stubs.c
stubs.c \
rpc.c \
pnp_c.c
C_SRCS16 = \
devinst16.c \

View file

@ -31,10 +31,19 @@
#include "cfgmgr32.h"
#include "setupapi_private.h"
#include "rpc.h"
#include "pnp.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(setupapi);
typedef struct _MACHINE_INFO
{
RPC_BINDING_HANDLE BindingHandle;
} MACHINE_INFO, *PMACHINE_INFO;
/***********************************************************************
* CM_Connect_MachineA [SETUPAPI.@]
@ -47,14 +56,10 @@ CONFIGRET WINAPI CM_Connect_MachineA(PCSTR UNCServerName, PHMACHINE phMachine)
TRACE("%s %p\n", UNCServerName, phMachine);
if (UNCServerName == NULL || *UNCServerName == 0)
{
return CM_Connect_MachineW(NULL, phMachine);
}
if (CaptureAndConvertAnsiArg(UNCServerName, &pServerNameW))
{
return CR_INVALID_DATA;
}
ret = CM_Connect_MachineW(pServerNameW, phMachine);
@ -69,8 +74,23 @@ CONFIGRET WINAPI CM_Connect_MachineA(PCSTR UNCServerName, PHMACHINE phMachine)
*/
CONFIGRET WINAPI CM_Connect_MachineW(PCWSTR UNCServerName, PHMACHINE phMachine)
{
FIXME("%s %p\n", debugstr_w(UNCServerName), phMachine);
return CR_ACCESS_DENIED;
PMACHINE_INFO pMachine;
TRACE("%s %p\n", debugstr_w(UNCServerName), phMachine);
pMachine = (PMACHINE_INFO)GlobalAlloc(GPTR, sizeof(MACHINE_INFO));
if (pMachine == NULL)
return CR_OUT_OF_MEMORY;
if (!PnpBindRpc(UNCServerName, &pMachine->BindingHandle))
{
GlobalFree(pMachine);
return CR_INVALID_MACHINENAME;
}
phMachine = (PHMACHINE)pMachine;
return CR_SUCCESS;
}
@ -79,7 +99,41 @@ CONFIGRET WINAPI CM_Connect_MachineW(PCWSTR UNCServerName, PHMACHINE phMachine)
*/
CONFIGRET WINAPI CM_Disconnect_Machine(HMACHINE hMachine)
{
FIXME("%lx\n", hMachine);
PMACHINE_INFO pMachine;
TRACE("%lx\n", hMachine);
if (hMachine == NULL)
return CR_SUCCESS;
pMachine = (PMACHINE_INFO)hMachine;
if (!PnpUnbindRpc(pMachine->BindingHandle))
return CR_ACCESS_DENIED;
GlobalFree(pMachine);
return CR_SUCCESS;
}
/***********************************************************************
* CM_Get_Child [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Get_Child(
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_Child_Ex [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Get_Child_Ex(
PDEVINST pdnDevInst, DEVINST dnDevInst, ULONG ulFlags, HMACHINE hMachine)
{
TRACE("%p %lx %lx %lx\n", pdnDevInst, dnDevInst, ulFlags, hMachine);
return CR_SUCCESS;
}
@ -154,9 +208,8 @@ CONFIGRET WINAPI CM_Get_Device_ID_List_SizeA(
CONFIGRET WINAPI CM_Get_Device_ID_List_SizeW(
PULONG pulLen, PCWSTR pszFilter, ULONG ulFlags)
{
FIXME("%p %s %ld\n", pulLen, debugstr_w(pszFilter), ulFlags);
*pulLen = 2;
return CR_SUCCESS;
TRACE("%p %s %ld\n", pulLen, debugstr_w(pszFilter), ulFlags);
return CM_Get_Device_ID_List_Size_ExW(pulLen, pszFilter, ulFlags, NULL);
}
@ -182,3 +235,128 @@ CONFIGRET WINAPI CM_Get_Device_ID_List_Size_ExW(
*pulLen = 2;
return CR_SUCCESS;
}
/***********************************************************************
* CM_Get_Parent [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Get_Parent(
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_Parent_Ex [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Get_Parent_Ex(
PDEVINST pdnDevInst, DEVINST dnDevInst, ULONG ulFlags, HMACHINE hMachine)
{
TRACE("%p %lx %lx %lx\n", pdnDevInst, dnDevInst, ulFlags, hMachine);
return CR_SUCCESS;
}
/***********************************************************************
* 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)
{
TRACE("%p %lx %lx %lx\n", pdnDevInst, dnDevInst, ulFlags, hMachine);
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;
RPC_STATUS Status;
FIXME("%lx\n", hMachine);
if (hMachine != NULL)
{
BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
if (BindingHandle == NULL)
return 0;
}
else
{
Status = PnpGetLocalBindingHandle(&BindingHandle);
if (Status != RPC_S_OK)
return 0;
}
return PNP_GetVersion(BindingHandle);
}
/***********************************************************************
* CM_Locate_DevNodeA [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Locate_DevNodeA(
PDEVINST pdnDevInst, DEVINSTID_A pDeviceID, ULONG ulFlags)
{
FIXME("%p %p %lu\n", pdnDevInst, pDeviceID, ulFlags);
return CR_SUCCESS;
}
/***********************************************************************
* CM_Locate_DevNodeW [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Locate_DevNodeW(
PDEVINST pdnDevInst, DEVINSTID_W pDeviceID, ULONG ulFlags)
{
TRACE("%p %p %lu\n", pdnDevInst, 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)
{
FIXME("%p %p %lu %lx\n", pdnDevInst, pDeviceID, ulFlags, hMachine);
return CR_SUCCESS;
}
/***********************************************************************
* CM_Locate_DevNode_ExW [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Locate_DevNode_ExW(
PDEVINST pdnDevInst, DEVINSTID_W pDeviceID, ULONG ulFlags, HMACHINE hMachine)
{
FIXME("%p %p %lu %lx\n", pdnDevInst, pDeviceID, ulFlags, hMachine);
return CR_SUCCESS;
}

View file

@ -4,6 +4,15 @@ PATH_TO_TOP = ../..
TARGET_TYPE = winedll
TARGET_CLEAN = pnp_c.c pnp.h
include $(PATH_TO_TOP)/rules.mak
include $(TOOLS_PATH)/helper.mk
WIDL_FLAGS = -o \
-D _X86_ -D MIDL_PASS \
-I $(PATH_TO_TOP)/w32api/include
pnp_c.c pnp.h: $(PATH_TO_TOP)/include/idl/pnp.idl
$(WIDL) $(WIDL_FLAGS) -h -H pnp.h -c -C pnp_c.c $(PATH_TO_TOP)/include/idl/pnp.idl

View file

@ -0,0 +1,82 @@
/* rpc.c */
#include <windows.h>
#include <rpc.h>
#include <rpcdce.h>
static RPC_BINDING_HANDLE LocalBindingHandle = NULL;
RPC_STATUS
PnpBindRpc(LPWSTR pszMachine,
RPC_BINDING_HANDLE* BindingHandle)
{
PWSTR pszStringBinding = NULL;
RPC_STATUS Status;
Status = RpcStringBindingComposeW(NULL,
L"ncacn_np",
pszMachine,
L"\\pipe\\umpnpmgr",
NULL,
&pszStringBinding);
if (Status != RPC_S_OK)
return Status;
Status = RpcBindingFromStringBindingW(pszStringBinding,
BindingHandle);
RpcStringFreeW(&pszStringBinding);
return Status;
}
RPC_STATUS
PnpUnbindRpc(RPC_BINDING_HANDLE *BindingHandle)
{
if (BindingHandle != NULL)
{
RpcBindingFree(*BindingHandle);
*BindingHandle = NULL;
}
return RPC_S_OK;
}
RPC_STATUS
PnpGetLocalBindingHandle(RPC_BINDING_HANDLE *BindingHandle)
{
if (LocalBindingHandle != NULL)
{
BindingHandle = LocalBindingHandle;
return RPC_S_OK;
}
return PnpBindRpc(NULL, BindingHandle);
}
RPC_STATUS
PnpUnbindLocalBindingHandle(VOID)
{
return PnpUnbindRpc(&LocalBindingHandle);
}
void __RPC_FAR * __RPC_USER
midl_user_allocate(size_t len)
{
return GlobalAlloc(GPTR, len);
}
void __RPC_USER
midl_user_free(void __RPC_FAR * ptr)
{
GlobalFree(ptr);
}
/* EOF */

View file

@ -53,8 +53,8 @@
@ stub CM_Free_Res_Des
@ stub CM_Free_Res_Des_Ex
@ stub CM_Free_Res_Des_Handle
@ stub CM_Get_Child
@ stub CM_Get_Child_Ex
@ stdcall CM_Get_Child(ptr long long)
@ stdcall CM_Get_Child_Ex(ptr long long long)
@ stub CM_Get_Class_Key_NameA
@ stub CM_Get_Class_Key_NameW
@ stub CM_Get_Class_Key_Name_ExA
@ -115,23 +115,23 @@
@ stub CM_Get_Next_Log_Conf_Ex
@ stub CM_Get_Next_Res_Des
@ stub CM_Get_Next_Res_Des_Ex
@ stub CM_Get_Parent
@ stub CM_Get_Parent_Ex
@ stdcall CM_Get_Parent(ptr long long)
@ stdcall CM_Get_Parent_Ex(ptr long long long)
@ stub CM_Get_Res_Des_Data
@ stub CM_Get_Res_Des_Data_Ex
@ stub CM_Get_Res_Des_Data_Size
@ stub CM_Get_Res_Des_Data_Size_Ex
@ stub CM_Get_Sibling
@ stub CM_Get_Sibling_Ex
@ stub CM_Get_Version
@ stub CM_Get_Version_Ex
@ stdcall CM_Get_Sibling(ptr long long)
@ stdcall CM_Get_Sibling_Ex(ptr long long long)
@ stdcall CM_Get_Version()
@ stdcall CM_Get_Version_Ex(long)
@ stub CM_Intersect_Range_List
@ stub CM_Invert_Range_List
@ stub CM_Is_Dock_Station_Present
@ stub CM_Locate_DevNodeA
@ stub CM_Locate_DevNodeW
@ stub CM_Locate_DevNode_ExA
@ stub CM_Locate_DevNode_ExW
@ stdcall CM_Locate_DevNodeA(ptr str long)
@ stdcall CM_Locate_DevNodeW(ptr wstr long)
@ stdcall CM_Locate_DevNode_ExA(ptr str long long)
@ stdcall CM_Locate_DevNode_ExW(ptr wstr long long)
@ stub CM_Merge_Range_List
@ stub CM_Modify_Res_Des
@ stub CM_Modify_Res_Des_Ex

View file

@ -12,12 +12,25 @@ TARGET_INSTALLDIR = system32
TARGET_SDKLIBS = ntdll.a kernel32.a advapi32.a rpcrt4.a
TARGET_OBJECTS = umpnpmgr.o
TARGET_OBJECTS = umpnpmgr.o pnp_s.o
TARGET_CFLAGS = -Wall -Werror -D__USE_W32API
TARGET_CFLAGS = -Wall -Werror -D__USE_W32API -DUNICODE -D_UNICODE
TARGET_CLEAN = pnp_s.c pnp.h
DEP_OBJECTS = $(TARGET_OBJECTS)
include $(PATH_TO_TOP)/rules.mak
include $(TOOLS_PATH)/helper.mk
include $(TOOLS_PATH)/depend.mk
WIDL_FLAGS = \
-D _X86_ -D MIDL_PASS \
-I $(PATH_TO_TOP)/w32api/include
pnp_s.c pnp.h: $(PATH_TO_TOP)/include/idl/pnp.idl
$(WIDL) $(WIDL_FLAGS) -h -H pnp.h -s -S pnp_s.c $(PATH_TO_TOP)/include/idl/pnp.idl
# EOF

View file

@ -27,9 +27,6 @@
/* INCLUDES *****************************************************************/
#define UNICODE
#define _UNICODE
#define NTOS_MODE_USER
#include <ntos.h>
#include <ntos/ntpnp.h>
@ -41,6 +38,8 @@
#include <rpc.h>
#include <rpcdce.h>
#include "pnp.h"
#define DBG
#define NDEBUG
#include <debug.h>
@ -61,6 +60,66 @@ static SERVICE_TABLE_ENTRY ServiceTable[2] =
/* FUNCTIONS *****************************************************************/
static DWORD WINAPI
RpcServerThread(LPVOID lpParameter)
{
RPC_STATUS Status;
DPRINT("RpcServerThread() called\n");
Status = RpcServerUseProtseqEpW(L"ncacn_np",
20,
L"\\pipe\\umpnpmgr",
NULL); // Security descriptor
if (Status != RPC_S_OK)
{
DPRINT1("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status);
return 0;
}
Status = RpcServerRegisterIf(pnp_v1_0_s_ifspec,
NULL,
NULL);
if (Status != RPC_S_OK)
{
DPRINT1("RpcServerRegisterIf() failed (Status %lx)\n", Status);
return 0;
}
Status = RpcServerListen(1,
20,
FALSE);
if (Status != RPC_S_OK)
{
DPRINT1("RpcServerListen() failed (Status %lx)\n", Status);
return 0;
}
DPRINT("RpcServerThread() done\n");
return 0;
}
void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
{
return GlobalAlloc(GPTR, len);
}
void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
{
GlobalFree(ptr);
}
//WORD PNP_GetVersion(RPC_BINDING_HANDLE BindingHandle)
WORD PNP_GetVersion(handle_t BindingHandle)
{
return 0x0400;
}
static DWORD WINAPI
PnpEventThread(LPVOID lpParameter)
{
@ -134,6 +193,15 @@ ServiceMain(DWORD argc, LPTSTR *argv)
if (hThread != NULL)
CloseHandle(hThread);
hThread = CreateThread(NULL,
0,
RpcServerThread,
NULL,
0,
&dwThreadId);
if (hThread != NULL)
CloseHandle(hThread);
DPRINT("ServiceMain() done\n");
}

View file

@ -1031,6 +1031,15 @@ typedef SP_BACKUP_QUEUE_PARAMS_A SP_BACKUP_QUEUE_PARAMS,
*PSP_BACKUP_QUEUE_PARAMS;
#endif /* UNICODE */
WINSETUPAPI LONG WINAPI AddTagToGroupOrderList(PCWSTR, DWORD, DWORD);
WINSETUPAPI PWSTR WINAPI DuplicateString(PCWSTR);
WINSETUPAPI BOOL WINAPI IsUserAdmin(VOID);
WINSETUPAPI VOID WINAPI MyFree(PVOID);
WINSETUPAPI PVOID WINAPI MyMalloc(DWORD);
WINSETUPAPI PVOID WINAPI MyRealloc(PVOID, DWORD);
WINSETUPAPI LONG WINAPI QueryRegistryValue(HKEY, PCWSTR, PBYTE*, PDWORD, PDWORD);
WINSETUPAPI BOOL WINAPI SetupAddInstallSectionToDiskSpaceListA(HDSKSPC,HINF,HINF,PCSTR,PVOID,UINT);
WINSETUPAPI BOOL WINAPI SetupAddInstallSectionToDiskSpaceListW(HDSKSPC,HINF,HINF,PCWSTR,PVOID,UINT);
WINSETUPAPI BOOL WINAPI SetupAddSectionToDiskSpaceListA(HDSKSPC,HINF,HINF,PCSTR,UINT,PVOID,UINT);