HRESULT TaskSchedulerConstructor(LPVOID *ppObj) { TaskSchedulerImpl *This; ITaskService *service; VARIANT v_null; HRESULT hr; TRACE("(%p)\n", ppObj); hr = CoCreateInstance(&CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER, &IID_ITaskService, (void **)&service); if (hr != S_OK) return hr; V_VT(&v_null) = VT_NULL; hr = ITaskService_Connect(service, v_null, v_null, v_null, v_null); if (hr != S_OK) { ITaskService_Release(service); return hr; } This = heap_alloc(sizeof(*This)); if (!This) { ITaskService_Release(service); return E_OUTOFMEMORY; } This->ITaskScheduler_iface.lpVtbl = &MSTASK_ITaskSchedulerVtbl; This->service = service; This->ref = 1; *ppObj = &This->ITaskScheduler_iface; InterlockedIncrement(&dll_ref); return S_OK; }
static HRESULT WINAPI MSTASK_ITaskScheduler_SetTargetComputer( ITaskScheduler *iface, LPCWSTR comp_name) { TaskSchedulerImpl *This = impl_from_ITaskScheduler(iface); VARIANT v_null, v_comp; HRESULT hr; TRACE("(%p)->(%s)\n", This, debugstr_w(comp_name)); V_VT(&v_null) = VT_NULL; V_VT(&v_comp) = VT_BSTR; V_BSTR(&v_comp) = SysAllocString(comp_name); hr = ITaskService_Connect(This->service, v_comp, v_null, v_null, v_null); SysFreeString(V_BSTR(&v_comp)); return hr; }
VOID PhpFillRunningTasks( __in PPH_PROCESS_ITEM Process, __inout PPH_STRING_BUILDER Tasks ) { static CLSID CLSID_TaskScheduler_I = { 0x0f87369f, 0xa4e5, 0x4cfc, { 0xbd, 0x3e, 0x73, 0xe6, 0x15, 0x45, 0x72, 0xdd } }; static IID IID_ITaskService_I = { 0x2faba4c7, 0x4da9, 0x4013, { 0x96, 0x97, 0x20, 0xcc, 0x3f, 0xd4, 0x0f, 0x85 } }; ITaskService *taskService; if (SUCCEEDED(CoCreateInstance( &CLSID_TaskScheduler_I, NULL, CLSCTX_INPROC_SERVER, &IID_ITaskService_I, &taskService ))) { VARIANT empty = { 0 }; if (SUCCEEDED(ITaskService_Connect(taskService, empty, empty, empty, empty))) { IRunningTaskCollection *runningTasks; if (SUCCEEDED(ITaskService_GetRunningTasks( taskService, TASK_ENUM_HIDDEN, &runningTasks ))) { LONG count; LONG i; VARIANT index; index.vt = VT_INT; if (SUCCEEDED(IRunningTaskCollection_get_Count(runningTasks, &count))) { for (i = 1; i <= count; i++) // collections are 1-based { IRunningTask *runningTask; index.lVal = i; if (SUCCEEDED(IRunningTaskCollection_get_Item(runningTasks, index, &runningTask))) { ULONG pid; BSTR action = NULL; BSTR path = NULL; if ( SUCCEEDED(IRunningTask_get_EnginePID(runningTask, &pid)) && pid == (ULONG)Process->ProcessId ) { IRunningTask_get_CurrentAction(runningTask, &action); IRunningTask_get_Path(runningTask, &path); PhAppendStringBuilder2(Tasks, L" "); PhAppendStringBuilder2(Tasks, action ? action : L"Unknown Action"); PhAppendStringBuilder2(Tasks, L" ("); PhAppendStringBuilder2(Tasks, path ? path : L"Unknown Path"); PhAppendStringBuilder2(Tasks, L")\n"); if (action) SysFreeString(action); if (path) SysFreeString(path); } IRunningTask_Release(runningTask); } } } IRunningTaskCollection_Release(runningTasks); } } ITaskService_Release(taskService); } }