[out, string, size_is(Length)] wchar_t *DeviceInstance,\r
[in] DWORD Length);\r
\r
-// cpp_quote("#define PNP_DEVICE_PARENT 1")\r
-// cpp_quote("#define PNP_DEVICE_CHILD 2")\r
-// cpp_quote("#define PNP_DEVICE_SIBLING 3")\r
-// CONFIGRET PNP_GetRelatedDeviceInstance(handle_t BindingHandle,\r
-// [in] DWORD Relationship,\r
-// [in, string] wchar_t *DeviceId,\r
-// [out, string, size_is(Length)] wchar_t *RelatedDeviceId,\r
-// [in] DWORD Length,\r
-// [in] DWORD Flags);\r
+ cpp_quote("#define PNP_DEVICE_PARENT 1")\r
+ cpp_quote("#define PNP_DEVICE_CHILD 2")\r
+ cpp_quote("#define PNP_DEVICE_SIBLING 3")\r
+ CONFIGRET PNP_GetRelatedDeviceInstance(handle_t BindingHandle,\r
+ [in] DWORD Relationship,\r
+ [in, string] wchar_t *DeviceId,\r
+ [out, string, size_is(Length)] wchar_t *RelatedDeviceId,\r
+ [in] DWORD Length,\r
+ [in] DWORD Flags);\r
\r
CONFIGRET PNP_GetDepth(handle_t BindingHandle,\r
[in, string] wchar_t *DeviceInstance,\r
[out] unsigned long *Status,\r
[out] unsigned long *Problem,\r
[in] DWORD Flags);\r
+\r
+ CONFIGRET PNP_SetDeviceProblem(handle_t BindingHandle,\r
+ [in, string] wchar_t *DeviceInstance,\r
+ [in] unsigned long Problem,\r
+ [in] DWORD Flags);\r
}\r
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;
*pdnDevInst = dwIndex;
return CR_SUCCESS;
-#endif
- FIXME("%p %lx %lx %lx\n", pdnDevInst, dnDevInst, ulFlags, hMachine);
- return CR_FAILURE;
}
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);
}
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;
*pdnDevInst = dwIndex;
return CR_SUCCESS;
-#endif
- FIXME("%p %lx %lx %lx\n", pdnDevInst, dnDevInst, ulFlags, hMachine);
- return CR_FAILURE;
}
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;
*pdnDevInst = dwIndex;
return CR_SUCCESS;
-#endif
- FIXME("%p %lx %lx %lx\n", pdnDevInst, dnDevInst, ulFlags, hMachine);
- return CR_FAILURE;
}
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);
+}
\r
static SERVICE_TABLE_ENTRY ServiceTable[2] =\r
{\r
- {TEXT("PlugPlay"), ServiceMain},\r
- {NULL, NULL}\r
+ {TEXT("PlugPlay"), ServiceMain},\r
+ {NULL, NULL}\r
};\r
\r
static WCHAR szRootDeviceId[] = L"HTREE\\ROOT\\0";\r
static DWORD WINAPI\r
RpcServerThread(LPVOID lpParameter)\r
{\r
- RPC_STATUS Status;\r
+ RPC_STATUS Status;\r
\r
- DPRINT("RpcServerThread() called\n");\r
+ DPRINT("RpcServerThread() called\n");\r
\r
- Status = RpcServerUseProtseqEpW(L"ncacn_np",\r
- 20,\r
- L"\\pipe\\umpnpmgr",\r
- NULL); // Security descriptor\r
- if (Status != RPC_S_OK)\r
- {\r
- DPRINT1("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status);\r
- return 0;\r
- }\r
-\r
- Status = RpcServerRegisterIf(pnp_v1_0_s_ifspec,\r
- NULL,\r
- NULL);\r
- if (Status != RPC_S_OK)\r
- {\r
- DPRINT1("RpcServerRegisterIf() failed (Status %lx)\n", Status);\r
- return 0;\r
- }\r
-\r
- Status = RpcServerListen(1,\r
- 20,\r
- FALSE);\r
- if (Status != RPC_S_OK)\r
- {\r
- DPRINT1("RpcServerListen() failed (Status %lx)\n", Status);\r
- return 0;\r
- }\r
+ Status = RpcServerUseProtseqEpW(L"ncacn_np",\r
+ 20,\r
+ L"\\pipe\\umpnpmgr",\r
+ NULL); // Security descriptor\r
+ if (Status != RPC_S_OK)\r
+ {\r
+ DPRINT1("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status);\r
+ return 0;\r
+ }\r
+\r
+ Status = RpcServerRegisterIf(pnp_v1_0_s_ifspec,\r
+ NULL,\r
+ NULL);\r
+ if (Status != RPC_S_OK)\r
+ {\r
+ DPRINT1("RpcServerRegisterIf() failed (Status %lx)\n", Status);\r
+ return 0;\r
+ }\r
+\r
+ Status = RpcServerListen(1,\r
+ 20,\r
+ FALSE);\r
+ if (Status != RPC_S_OK)\r
+ {\r
+ DPRINT1("RpcServerListen() failed (Status %lx)\n", Status);\r
+ return 0;\r
+ }\r
\r
- DPRINT("RpcServerThread() done\n");\r
+ DPRINT("RpcServerThread() done\n");\r
\r
- return 0;\r
+ return 0;\r
}\r
\r
\r
}\r
\r
\r
-#if 0\r
CONFIGRET\r
PNP_GetRelatedDeviceInstance(handle_t BindingHandle,\r
unsigned long Relationship,\r
unsigned long Length,\r
unsigned long Flags)\r
{\r
+ PLUGPLAY_CONTROL_RELATED_DEVICE_DATA PlugPlayData;\r
CONFIGRET ret = CR_SUCCESS;\r
+ NTSTATUS Status;\r
\r
- DPRINT1("PNP_GetRelatedDeviceInstance() called\n");\r
- DPRINT1(" Relationship %ld\n", Relationship);\r
- DPRINT1(" DeviceId %S\n", DeviceId);\r
+ DPRINT("PNP_GetRelatedDeviceInstance() called\n");\r
+ DPRINT(" Relationship %ld\n", Relationship);\r
+ DPRINT(" DeviceId %S\n", DeviceId);\r
\r
- lstrcpyW(RelatedDeviceId,\r
- szRootDeviceId);\r
+ RtlInitUnicodeString(&PlugPlayData.TargetDeviceInstance,\r
+ DeviceId);\r
+\r
+ PlugPlayData.Relation = Relationship;\r
+\r
+ PlugPlayData.RelatedDeviceInstance.Length = 0;\r
+ PlugPlayData.RelatedDeviceInstance.MaximumLength = Length;\r
+ PlugPlayData.RelatedDeviceInstance.Buffer = RelatedDeviceId;\r
+\r
+ Status = NtPlugPlayControl(PlugPlayControlGetRelatedDevice,\r
+ (PVOID)&PlugPlayData,\r
+ sizeof(PLUGPLAY_CONTROL_RELATED_DEVICE_DATA));\r
+ if (!NT_SUCCESS(Status))\r
+ {\r
+ /* FIXME: Map Status to ret */\r
+ ret = CR_FAILURE;\r
+ }\r
\r
-//Done:\r
- DPRINT1("PNP_GetRelatedDeviceInstance() done (returns %lx)\n", ret);\r
+ DPRINT("PNP_GetRelatedDeviceInstance() done (returns %lx)\n", ret);\r
+ if (ret == 0)\r
+ {\r
+ DPRINT("RelatedDevice: %wZ\n", &PlugPlayData.RelatedDeviceInstance);\r
+ }\r
\r
return ret;\r
}\r
-#endif\r
\r
\r
CONFIGRET\r
}\r
\r
\r
+CONFIGRET\r
+PNP_SetDeviceProblem(handle_t BindingHandle,\r
+ wchar_t *DeviceInstance,\r
+ unsigned long Problem,\r
+ DWORD Flags)\r
+{\r
+ CONFIGRET ret = CR_SUCCESS;\r
+\r
+ DPRINT1("PNP_SetDeviceProblem() called\n");\r
+\r
+ /* FIXME */\r
+\r
+ DPRINT1("PNP_SetDeviceProblem() done (returns %lx)\n", ret);\r
+\r
+ return ret;\r
+}\r
+\r
+\r
static DWORD WINAPI\r
PnpEventThread(LPVOID lpParameter)\r
{\r
- PPLUGPLAY_EVENT_BLOCK PnpEvent;\r
- ULONG PnpEventSize;\r
- NTSTATUS Status;\r
- RPC_STATUS RpcStatus;\r
-\r
- PnpEventSize = 0x1000;\r
- PnpEvent = HeapAlloc(GetProcessHeap(), 0, PnpEventSize);\r
- if (PnpEvent == NULL)\r
- return ERROR_OUTOFMEMORY;\r
-\r
- for (;;)\r
- {\r
- DPRINT("Calling NtGetPlugPlayEvent()\n");\r
-\r
- /* Wait for the next pnp event */\r
- Status = NtGetPlugPlayEvent(0, 0, PnpEvent, PnpEventSize);\r
- /* Resize the buffer for the PnP event if it's too small. */\r
- if (Status == STATUS_BUFFER_TOO_SMALL)\r
- {\r
- PnpEventSize += 0x400;\r
- PnpEvent = HeapReAlloc(GetProcessHeap(), 0, PnpEvent, PnpEventSize);\r
- if (PnpEvent == NULL)\r
+ PPLUGPLAY_EVENT_BLOCK PnpEvent;\r
+ ULONG PnpEventSize;\r
+ NTSTATUS Status;\r
+ RPC_STATUS RpcStatus;\r
+\r
+ PnpEventSize = 0x1000;\r
+ PnpEvent = HeapAlloc(GetProcessHeap(), 0, PnpEventSize);\r
+ if (PnpEvent == NULL)\r
return ERROR_OUTOFMEMORY;\r
- continue;\r
- }\r
- if (!NT_SUCCESS(Status))\r
- {\r
- DPRINT("NtPlugPlayEvent() failed (Status %lx)\n", Status);\r
- break;\r
- }\r
\r
- DPRINT("Received PnP Event\n");\r
- if (UuidEqual(&PnpEvent->EventGuid, (UUID*)&GUID_DEVICE_ARRIVAL, &RpcStatus))\r
+ for (;;)\r
{\r
- DPRINT1("Device arrival event: %S\n", PnpEvent->TargetDevice.DeviceIds);\r
- }\r
- else\r
- {\r
- DPRINT1("Unknown event\n");\r
+ DPRINT("Calling NtGetPlugPlayEvent()\n");\r
+\r
+ /* Wait for the next pnp event */\r
+ Status = NtGetPlugPlayEvent(0, 0, PnpEvent, PnpEventSize);\r
+\r
+ /* Resize the buffer for the PnP event if it's too small. */\r
+ if (Status == STATUS_BUFFER_TOO_SMALL)\r
+ {\r
+ PnpEventSize += 0x400;\r
+ PnpEvent = HeapReAlloc(GetProcessHeap(), 0, PnpEvent, PnpEventSize);\r
+ if (PnpEvent == NULL)\r
+ return ERROR_OUTOFMEMORY;\r
+ continue;\r
+ }\r
+\r
+ if (!NT_SUCCESS(Status))\r
+ {\r
+ DPRINT("NtPlugPlayEvent() failed (Status %lx)\n", Status);\r
+ break;\r
+ }\r
+\r
+ DPRINT("Received PnP Event\n");\r
+ if (UuidEqual(&PnpEvent->EventGuid, (UUID*)&GUID_DEVICE_ARRIVAL, &RpcStatus))\r
+ {\r
+ DPRINT1("Device arrival event: %S\n", PnpEvent->TargetDevice.DeviceIds);\r
+ }\r
+ else\r
+ {\r
+ DPRINT1("Unknown event\n");\r
+ }\r
+\r
+ /* FIXME: Process the pnp event */\r
+\r
+ /* Dequeue the current pnp event and signal the next one */\r
+ NtPlugPlayControl(PlugPlayControlUserResponse, NULL, 0);\r
}\r
\r
- /* FIXME: Process the pnp event */\r
+ HeapFree(GetProcessHeap(), 0, PnpEvent);\r
\r
- /* Dequeue the current pnp event and signal the next one */\r
- NtPlugPlayControl(PlugPlayControlUserResponse, NULL, 0);\r
- }\r
-\r
- HeapFree(GetProcessHeap(), 0, PnpEvent);\r
-\r
- return ERROR_SUCCESS;\r
+ return ERROR_SUCCESS;\r
}\r
\r
\r
static VOID CALLBACK\r
ServiceMain(DWORD argc, LPTSTR *argv)\r
{\r
- HANDLE hThread;\r
- DWORD dwThreadId;\r
-\r
- DPRINT("ServiceMain() called\n");\r
-\r
- hThread = CreateThread(NULL,\r
- 0,\r
- PnpEventThread,\r
- NULL,\r
- 0,\r
- &dwThreadId);\r
- if (hThread != NULL)\r
- CloseHandle(hThread);\r
-\r
- hThread = CreateThread(NULL,\r
- 0,\r
- RpcServerThread,\r
- NULL,\r
- 0,\r
- &dwThreadId);\r
- if (hThread != NULL)\r
- CloseHandle(hThread);\r
-\r
- DPRINT("ServiceMain() done\n");\r
+ HANDLE hThread;\r
+ DWORD dwThreadId;\r
+\r
+ DPRINT("ServiceMain() called\n");\r
+\r
+ hThread = CreateThread(NULL,\r
+ 0,\r
+ PnpEventThread,\r
+ NULL,\r
+ 0,\r
+ &dwThreadId);\r
+ if (hThread != NULL)\r
+ CloseHandle(hThread);\r
+\r
+ hThread = CreateThread(NULL,\r
+ 0,\r
+ RpcServerThread,\r
+ NULL,\r
+ 0,\r
+ &dwThreadId);\r
+ if (hThread != NULL)\r
+ CloseHandle(hThread);\r
+\r
+ DPRINT("ServiceMain() done\n");\r
}\r
\r
\r
int\r
main(int argc, char *argv[])\r
{\r
- DPRINT("Umpnpmgr: main() started\n");\r
+ DPRINT("Umpnpmgr: main() started\n");\r
\r
- StartServiceCtrlDispatcher(ServiceTable);\r
+ StartServiceCtrlDispatcher(ServiceTable);\r
\r
- DPRINT("Umpnpmgr: main() done\n");\r
+ DPRINT("Umpnpmgr: main() done\n");\r
\r
- ExitThread(0);\r
+ ExitThread(0);\r
\r
- return 0;\r
+ return 0;\r
}\r
\r
/* EOF */\r