- Implement CM_Get_Child_Ex, CM_Get_Parent_Ex, CM_Get_Sibling_Ex and CM_Set_DevNode_Problem[_Ex]. - Clean-up indentation. Modified: trunk/reactos/include/idl/pnp.idl Modified: trunk/reactos/include/wine/cfgmgr32.h Modified: trunk/reactos/lib/setupapi/cfgmgr.c Modified: trunk/reactos/lib/setupapi/setupapi.spec Modified: trunk/reactos/services/umpnpmgr/umpnpmgr.c Modified: trunk/reactos/w32api/include/ddk/cfgmgr32.h _____
Modified: trunk/reactos/include/idl/pnp.idl --- trunk/reactos/include/idl/pnp.idl 2005-07-23 11:55:33 UTC (rev 16703) +++ trunk/reactos/include/idl/pnp.idl 2005-07-23 13:43:52 UTC (rev 16704) @@ -29,15 +29,15 @@
[out, string, size_is(Length)] wchar_t *DeviceInstance, [in] DWORD Length);
-// cpp_quote("#define PNP_DEVICE_PARENT 1") -// cpp_quote("#define PNP_DEVICE_CHILD 2") -// cpp_quote("#define PNP_DEVICE_SIBLING 3") -// CONFIGRET PNP_GetRelatedDeviceInstance(handle_t BindingHandle, -// [in] DWORD Relationship, -// [in, string] wchar_t *DeviceId, -// [out, string, size_is(Length)] wchar_t *RelatedDeviceId, -// [in] DWORD Length, -// [in] DWORD Flags); + cpp_quote("#define PNP_DEVICE_PARENT 1") + cpp_quote("#define PNP_DEVICE_CHILD 2") + cpp_quote("#define PNP_DEVICE_SIBLING 3") + CONFIGRET PNP_GetRelatedDeviceInstance(handle_t BindingHandle, + [in] DWORD Relationship, + [in, string] wchar_t *DeviceId, + [out, string, size_is(Length)] wchar_t *RelatedDeviceId, + [in] DWORD Length, + [in] DWORD Flags);
CONFIGRET PNP_GetDepth(handle_t BindingHandle, [in, string] wchar_t *DeviceInstance, @@ -49,4 +49,9 @@ [out] unsigned long *Status, [out] unsigned long *Problem, [in] DWORD Flags); + + CONFIGRET PNP_SetDeviceProblem(handle_t BindingHandle, + [in, string] wchar_t *DeviceInstance, + [in] unsigned long Problem, + [in] DWORD Flags); } _____
Modified: trunk/reactos/include/wine/cfgmgr32.h --- trunk/reactos/include/wine/cfgmgr32.h 2005-07-23 11:55:33 UTC (rev 16703) +++ trunk/reactos/include/wine/cfgmgr32.h 2005-07-23 13:43:52 UTC (rev 16704) @@ -84,7 +84,16 @@
#define CM_LOCATE_DEVINST_NOVALIDATION CM_LOCATE_DEVNODE_NOVALIDATION #define CM_LOCATE_DEVINST_BITS CM_LOCATE_DEVNODE_BITS
+/* ulFlags for CM_Set_DevNode_Problem[_Ex] */ +#define CM_SET_DEVNODE_PROBLEM_NORMAL 0x00000000 +#define CM_SET_DEVNODE_PROBLEM_OVERRIDE 0x00000001 +#define CM_SET_DEVNODE_PROBLEM_BITS 0x00000001
+#define CM_SET_DEVINST_PROBLEM_NORMAL CM_SET_DEVNODE_PROBLEM_NORMAL +#define CM_SET_DEVINST_PROBLEM_OVERRIDE CM_SET_DEVNODE_PROBLEM_OVERRIDE +#define CM_SET_DEVINST_PROBLEM_BITS CM_SET_DEVNODE_PROBLEM_BITS + + CONFIGRET WINAPI CM_Connect_MachineA( PCSTR, PHMACHINE ); CONFIGRET WINAPI CM_Connect_MachineW( PCWSTR, PHMACHINE ); #define CM_Connect_Machine WINELIB_NAME_AW(CM_Connect_Machine) @@ -141,5 +150,7 @@ CONFIGRET WINAPI CM_Open_Class_Key_ExW(LPGUID, LPCWSTR, REGSAM, REGDISPOSITION, PHKEY, ULONG, HMACHINE); #define CM_Open_Class_Key_Ex WINELIB_NAME_AW(CM_Open_Class_Key_Ex)
+CONFIGRET WINAPI CM_Set_DevNode_Problem( DEVINST, ULONG, ULONG ); +CONFIGRET WINAPI CM_Set_DevNode_Problem_Ex( DEVINST, ULONG, ULONG, HMACHINE );
#endif /* _CFGMGR32_H_ */ _____
Modified: trunk/reactos/lib/setupapi/cfgmgr.c --- trunk/reactos/lib/setupapi/cfgmgr.c 2005-07-23 11:55:33 UTC (rev 16703) +++ trunk/reactos/lib/setupapi/cfgmgr.c 2005-07-23 13:43:52 UTC (rev 16704) @@ -251,7 +251,6 @@
CONFIGRET WINAPI CM_Get_Child_Ex( PDEVINST pdnDevInst, DEVINST dnDevInst, ULONG ulFlags, HMACHINE hMachine) { -#if 0 WCHAR szRelatedDevInst[MAX_DEVICE_ID_LEN]; RPC_BINDING_HANDLE BindingHandle = NULL; HSTRING_TABLE StringTable = NULL; @@ -310,9 +309,6 @@ *pdnDevInst = dwIndex;
return CR_SUCCESS; -#endif - FIXME("%p %lx %lx %lx\n", pdnDevInst, dnDevInst, ulFlags, hMachine); - return CR_FAILURE; }
@@ -322,8 +318,7 @@ CONFIGRET WINAPI CM_Get_Depth( PULONG pulDepth, DEVINST dnDevInst, ULONG ulFlags) { - TRACE("%p %lx %lx\n", - pulDepth, dnDevInst, ulFlags); + TRACE("%p %lx %lx\n", pulDepth, dnDevInst, ulFlags); return CM_Get_Depth_Ex(pulDepth, dnDevInst, ulFlags, NULL); }
@@ -738,7 +733,6 @@ CONFIGRET WINAPI CM_Get_Parent_Ex( PDEVINST pdnDevInst, DEVINST dnDevInst, ULONG ulFlags, HMACHINE hMachine) { -#if 0 WCHAR szRelatedDevInst[MAX_DEVICE_ID_LEN]; RPC_BINDING_HANDLE BindingHandle = NULL; HSTRING_TABLE StringTable = NULL; @@ -797,9 +791,6 @@ *pdnDevInst = dwIndex;
return CR_SUCCESS; -#endif - FIXME("%p %lx %lx %lx\n", pdnDevInst, dnDevInst, ulFlags, hMachine); - return CR_FAILURE; }
@@ -820,7 +811,6 @@ CONFIGRET WINAPI CM_Get_Sibling_Ex( PDEVINST pdnDevInst, DEVINST dnDevInst, ULONG ulFlags, HMACHINE hMachine) { -#if 0 WCHAR szRelatedDevInst[MAX_DEVICE_ID_LEN]; RPC_BINDING_HANDLE BindingHandle = NULL; HSTRING_TABLE StringTable = NULL; @@ -879,9 +869,6 @@ *pdnDevInst = dwIndex;
return CR_SUCCESS; -#endif - FIXME("%p %lx %lx %lx\n", pdnDevInst, dnDevInst, ulFlags, hMachine); - return CR_FAILURE; }
@@ -1035,3 +1022,60 @@
return rc; } + + +/********************************************************************** * + * CM_Set_DevNode_Problem [SETUPAPI.@] + */ +CONFIGRET WINAPI CM_Set_DevNode_Problem( + DEVINST dnDevInst, ULONG ulProblem, ULONG ulFlags) +{ + TRACE("%lx %lx %lx\n", dnDevInst, ulProblem, ulFlags); + return CM_Set_DevNode_Problem_Ex(dnDevInst, ulProblem, ulFlags, NULL); +} + + +/********************************************************************** * + * CM_Set_DevNode_Problem_Ex [SETUPAPI.@] + */ +CONFIGRET WINAPI CM_Set_DevNode_Problem_Ex( + DEVINST dnDevInst, ULONG ulProblem, ULONG ulFlags, HMACHINE hMachine) +{ + RPC_BINDING_HANDLE BindingHandle = NULL; + HSTRING_TABLE StringTable = NULL; + LPWSTR lpDevInst; + CONFIGRET rc = CR_SUCCESS; + + TRACE("%lx %lx %lx %lx\n", dnDevInst, ulProblem, ulFlags, hMachine); + + if (dnDevInst == 0) + return CR_INVALID_DEVNODE; + + if (ulFlags & ~CM_SET_DEVNODE_PROBLEM_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; + } + + lpDevInst = StringTableStringFromId(StringTable, dnDevInst); + if (lpDevInst == NULL) + return CR_INVALID_DEVNODE; + + return PNP_SetDeviceProblem(BindingHandle, + lpDevInst, + ulProblem, + ulFlags); +} _____
Modified: trunk/reactos/lib/setupapi/setupapi.spec --- trunk/reactos/lib/setupapi/setupapi.spec 2005-07-23 11:55:33 UTC (rev 16703) +++ trunk/reactos/lib/setupapi/setupapi.spec 2005-07-23 13:43:52 UTC (rev 16704) @@ -170,8 +170,8 @@
@ stub CM_Reset_Children_Marks_Ex @ stub CM_Run_Detection @ stub CM_Run_Detection_Ex -@ stub CM_Set_DevNode_Problem -@ stub CM_Set_DevNode_Problem_Ex +@ stdcall CM_Set_DevNode_Problem(long long long) +@ stdcall CM_Set_DevNode_Problem_Ex(long long long long) @ stub CM_Set_DevNode_Registry_PropertyA @ stub CM_Set_DevNode_Registry_PropertyW @ stub CM_Set_DevNode_Registry_Property_ExA _____
Modified: trunk/reactos/services/umpnpmgr/umpnpmgr.c --- trunk/reactos/services/umpnpmgr/umpnpmgr.c 2005-07-23 11:55:33 UTC (rev 16703) +++ trunk/reactos/services/umpnpmgr/umpnpmgr.c 2005-07-23 13:43:52 UTC (rev 16704) @@ -48,8 +48,8 @@
static SERVICE_TABLE_ENTRY ServiceTable[2] = { - {TEXT("PlugPlay"), ServiceMain}, - {NULL, NULL} + {TEXT("PlugPlay"), ServiceMain}, + {NULL, NULL} };
static WCHAR szRootDeviceId[] = L"HTREE\ROOT\0"; @@ -59,41 +59,41 @@ static DWORD WINAPI RpcServerThread(LPVOID lpParameter) { - RPC_STATUS Status; + RPC_STATUS Status;
- DPRINT("RpcServerThread() called\n"); + 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 = 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 = 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; - } + Status = RpcServerListen(1, + 20, + FALSE); + if (Status != RPC_S_OK) + { + DPRINT1("RpcServerListen() failed (Status %lx)\n", Status); + return 0; + }
- DPRINT("RpcServerThread() done\n"); + DPRINT("RpcServerThread() done\n");
- return 0; + return 0; }
@@ -202,7 +202,6 @@ }
-#if 0 CONFIGRET PNP_GetRelatedDeviceInstance(handle_t BindingHandle, unsigned long Relationship, @@ -211,21 +210,40 @@ unsigned long Length, unsigned long Flags) { + PLUGPLAY_CONTROL_RELATED_DEVICE_DATA PlugPlayData; CONFIGRET ret = CR_SUCCESS; + NTSTATUS Status;
- DPRINT1("PNP_GetRelatedDeviceInstance() called\n"); - DPRINT1(" Relationship %ld\n", Relationship); - DPRINT1(" DeviceId %S\n", DeviceId); + DPRINT("PNP_GetRelatedDeviceInstance() called\n"); + DPRINT(" Relationship %ld\n", Relationship); + DPRINT(" DeviceId %S\n", DeviceId);
- lstrcpyW(RelatedDeviceId, - szRootDeviceId); + RtlInitUnicodeString(&PlugPlayData.TargetDeviceInstance, + DeviceId);
-//Done: - DPRINT1("PNP_GetRelatedDeviceInstance() done (returns %lx)\n", ret); + PlugPlayData.Relation = Relationship;
+ PlugPlayData.RelatedDeviceInstance.Length = 0; + PlugPlayData.RelatedDeviceInstance.MaximumLength = Length; + PlugPlayData.RelatedDeviceInstance.Buffer = RelatedDeviceId; + + Status = NtPlugPlayControl(PlugPlayControlGetRelatedDevice, + (PVOID)&PlugPlayData, + sizeof(PLUGPLAY_CONTROL_RELATED_DEVICE_DATA)); + if (!NT_SUCCESS(Status)) + { + /* FIXME: Map Status to ret */ + ret = CR_FAILURE; + } + + DPRINT("PNP_GetRelatedDeviceInstance() done (returns %lx)\n", ret); + if (ret == 0) + { + DPRINT("RelatedDevice: %wZ\n", &PlugPlayData.RelatedDeviceInstance); + } + return ret; } -#endif
CONFIGRET @@ -297,104 +315,124 @@ }
+CONFIGRET +PNP_SetDeviceProblem(handle_t BindingHandle, + wchar_t *DeviceInstance, + unsigned long Problem, + DWORD Flags) +{ + CONFIGRET ret = CR_SUCCESS; + + DPRINT1("PNP_SetDeviceProblem() called\n"); + + /* FIXME */ + + DPRINT1("PNP_SetDeviceProblem() done (returns %lx)\n", ret); + + return ret; +} + + static DWORD WINAPI PnpEventThread(LPVOID lpParameter) { - PPLUGPLAY_EVENT_BLOCK PnpEvent; - ULONG PnpEventSize; - NTSTATUS Status; - RPC_STATUS RpcStatus; + PPLUGPLAY_EVENT_BLOCK PnpEvent; + ULONG PnpEventSize; + NTSTATUS Status; + RPC_STATUS RpcStatus;
- PnpEventSize = 0x1000; - PnpEvent = HeapAlloc(GetProcessHeap(), 0, PnpEventSize); - if (PnpEvent == NULL) - return ERROR_OUTOFMEMORY; - - for (;;) - { - DPRINT("Calling NtGetPlugPlayEvent()\n"); - - /* Wait for the next pnp event */ - Status = NtGetPlugPlayEvent(0, 0, PnpEvent, PnpEventSize); - /* Resize the buffer for the PnP event if it's too small. */ - if (Status == STATUS_BUFFER_TOO_SMALL) - { - PnpEventSize += 0x400; - PnpEvent = HeapReAlloc(GetProcessHeap(), 0, PnpEvent, PnpEventSize); - if (PnpEvent == NULL) + PnpEventSize = 0x1000; + PnpEvent = HeapAlloc(GetProcessHeap(), 0, PnpEventSize); + if (PnpEvent == NULL) return ERROR_OUTOFMEMORY; - continue; - } - if (!NT_SUCCESS(Status)) - { - DPRINT("NtPlugPlayEvent() failed (Status %lx)\n", Status); - break; - }
- DPRINT("Received PnP Event\n"); - if (UuidEqual(&PnpEvent->EventGuid, (UUID*)&GUID_DEVICE_ARRIVAL, &RpcStatus)) + for (;;) { - DPRINT1("Device arrival event: %S\n", PnpEvent->TargetDevice.DeviceIds); - } - else - { - DPRINT1("Unknown event\n"); - } + DPRINT("Calling NtGetPlugPlayEvent()\n");
- /* FIXME: Process the pnp event */ + /* Wait for the next pnp event */ + Status = NtGetPlugPlayEvent(0, 0, PnpEvent, PnpEventSize);
- /* Dequeue the current pnp event and signal the next one */ - NtPlugPlayControl(PlugPlayControlUserResponse, NULL, 0); - } + /* Resize the buffer for the PnP event if it's too small. */ + if (Status == STATUS_BUFFER_TOO_SMALL) + { + PnpEventSize += 0x400; + PnpEvent = HeapReAlloc(GetProcessHeap(), 0, PnpEvent, PnpEventSize); + if (PnpEvent == NULL) + return ERROR_OUTOFMEMORY; + continue; + }
- HeapFree(GetProcessHeap(), 0, PnpEvent); + if (!NT_SUCCESS(Status)) + { + DPRINT("NtPlugPlayEvent() failed (Status %lx)\n", Status); + break; + }
- return ERROR_SUCCESS; + DPRINT("Received PnP Event\n"); + if (UuidEqual(&PnpEvent->EventGuid, (UUID*)&GUID_DEVICE_ARRIVAL, &RpcStatus)) + { + DPRINT1("Device arrival event: %S\n", PnpEvent->TargetDevice.DeviceIds); + } + else + { + DPRINT1("Unknown event\n"); + } + + /* FIXME: Process the pnp event */ + + /* Dequeue the current pnp event and signal the next one */ + NtPlugPlayControl(PlugPlayControlUserResponse, NULL, 0); + } + + HeapFree(GetProcessHeap(), 0, PnpEvent); + + return ERROR_SUCCESS; }
static VOID CALLBACK ServiceMain(DWORD argc, LPTSTR *argv) { - HANDLE hThread; - DWORD dwThreadId; + HANDLE hThread; + DWORD dwThreadId;
- DPRINT("ServiceMain() called\n"); + DPRINT("ServiceMain() called\n");
- hThread = CreateThread(NULL, - 0, - PnpEventThread, - NULL, - 0, - &dwThreadId); - if (hThread != NULL) - CloseHandle(hThread); + hThread = CreateThread(NULL, + 0, + PnpEventThread, + NULL, + 0, + &dwThreadId); + if (hThread != NULL) + CloseHandle(hThread);
- hThread = CreateThread(NULL, - 0, - RpcServerThread, - NULL, - 0, - &dwThreadId); - if (hThread != NULL) - CloseHandle(hThread); + hThread = CreateThread(NULL, + 0, + RpcServerThread, + NULL, + 0, + &dwThreadId); + if (hThread != NULL) + CloseHandle(hThread);
- DPRINT("ServiceMain() done\n"); + DPRINT("ServiceMain() done\n"); }
int main(int argc, char *argv[]) { - DPRINT("Umpnpmgr: main() started\n"); + DPRINT("Umpnpmgr: main() started\n");
- StartServiceCtrlDispatcher(ServiceTable); + StartServiceCtrlDispatcher(ServiceTable);
- DPRINT("Umpnpmgr: main() done\n"); + DPRINT("Umpnpmgr: main() done\n");
- ExitThread(0); + ExitThread(0);
- return 0; + return 0; }
/* EOF */ _____
Modified: trunk/reactos/w32api/include/ddk/cfgmgr32.h --- trunk/reactos/w32api/include/ddk/cfgmgr32.h 2005-07-23 11:55:33 UTC (rev 16703) +++ trunk/reactos/w32api/include/ddk/cfgmgr32.h 2005-07-23 13:43:52 UTC (rev 16704) @@ -108,7 +108,7 @@
typedef DWORD RETURN_TYPE; -typedef RETURN_TYPE CONFIGRET; +typedef RETURN_TYPE CONFIGRET;
typedef HANDLE HMACHINE; typedef HMACHINE *PHMACHINE;