2 * Win32_Process methods implementation
4 * Copyright 2013 Hans Leidekker for CodeWeavers
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
29 #include "wine/debug.h"
30 #include "wbemprox_private.h"
32 WINE_DEFAULT_DEBUG_CHANNEL(wbemprox
);
34 static HRESULT
get_owner( VARIANT
*user
, VARIANT
*domain
, VARIANT
*retval
)
40 GetUserNameW( NULL
, &len
);
41 if (GetLastError() != ERROR_INSUFFICIENT_BUFFER
) goto done
;
42 if (!(V_BSTR( user
) = SysAllocStringLen( NULL
, len
- 1 ))) goto done
;
43 if (!GetUserNameW( V_BSTR( user
), &len
)) goto done
;
44 V_VT( user
) = VT_BSTR
;
47 GetComputerNameW( NULL
, &len
);
48 if (GetLastError() != ERROR_BUFFER_OVERFLOW
) goto done
;
49 if (!(V_BSTR( domain
) = SysAllocStringLen( NULL
, len
- 1 ))) goto done
;
50 if (!GetComputerNameW( V_BSTR( domain
), &len
)) goto done
;
51 V_VT( domain
) = VT_BSTR
;
59 VariantClear( domain
);
61 set_variant( VT_UI4
, error
, NULL
, retval
);
65 HRESULT
process_get_owner( IWbemClassObject
*obj
, IWbemContext
*context
, IWbemClassObject
*in
, IWbemClassObject
**out
)
67 VARIANT user
, domain
, retval
;
68 IWbemClassObject
*sig
, *out_params
= NULL
;
71 TRACE("%p, %p, %p, %p\n", obj
, context
, in
, out
);
73 hr
= create_signature( WBEMPROX_NAMESPACE_CIMV2
, L
"Win32_Process", L
"GetOwner", PARAM_OUT
, &sig
);
74 if (hr
!= S_OK
) return hr
;
78 hr
= IWbemClassObject_SpawnInstance( sig
, 0, &out_params
);
81 IWbemClassObject_Release( sig
);
86 VariantInit( &domain
);
87 hr
= get_owner( &user
, &domain
, &retval
);
88 if (hr
!= S_OK
) goto done
;
91 if (!V_UI4( &retval
))
93 hr
= IWbemClassObject_Put( out_params
, L
"User", 0, &user
, CIM_STRING
);
94 if (hr
!= S_OK
) goto done
;
95 hr
= IWbemClassObject_Put( out_params
, L
"Domain", 0, &domain
, CIM_STRING
);
96 if (hr
!= S_OK
) goto done
;
98 hr
= IWbemClassObject_Put( out_params
, L
"ReturnValue", 0, &retval
, CIM_UINT32
);
102 VariantClear( &user
);
103 VariantClear( &domain
);
104 IWbemClassObject_Release( sig
);
105 if (hr
== S_OK
&& out
)
108 IWbemClassObject_AddRef( out_params
);
110 if (out_params
) IWbemClassObject_Release( out_params
);
114 HRESULT
process_create( IWbemClassObject
*obj
, IWbemContext
*context
, IWbemClassObject
*in
, IWbemClassObject
**out
)
116 VARIANT command_line
, current_directory
, startup_info
;
117 HRESULT ret
= WBEM_E_INVALID_PARAMETER
, hr
;
118 IWbemClassObject
*sig
, *out_params
= NULL
;
119 PROCESS_INFORMATION pi
;
126 FIXME("%p, %p, %p, %p stub\n", obj
, context
, in
, out
);
130 if ((hr
= create_signature( WBEMPROX_NAMESPACE_CIMV2
, L
"Win32_Process", L
"Create", PARAM_OUT
, &sig
))) return hr
;
132 VariantInit( &command_line
);
133 VariantInit( ¤t_directory
);
134 VariantInit( &startup_info
);
136 if (FAILED(hr
= IWbemClassObject_Get( in
, L
"CommandLine", 0, &command_line
, &type
, NULL
))
137 || V_VT( &command_line
) != VT_BSTR
)
138 WARN( "invalid CommandLine, hr %#lx, type %u\n", hr
, V_VT( &command_line
));
140 TRACE( "CommandLine %s.\n", debugstr_w( V_BSTR( &command_line
)));
142 if (FAILED(hr
= IWbemClassObject_Get( in
, L
"CurrentDirectory", 0, ¤t_directory
, &type
, NULL
))
143 || V_VT( ¤t_directory
) != VT_BSTR
)
144 WARN("invalid CurrentDirectory, hr %#lx, type %u\n", hr
, V_VT( ¤t_directory
));
146 TRACE( "CurrentDirectory %s.\n", debugstr_w( V_BSTR( ¤t_directory
)));
148 if (SUCCEEDED(IWbemClassObject_Get( in
, L
"ProcessStartupInformation", 0, &startup_info
, &type
, NULL
))
149 && V_VT( &startup_info
) == VT_UNKNOWN
&& V_UNKNOWN( &startup_info
))
150 FIXME( "ProcessStartupInformation is not implemented, vt_type %u, type %lu, val %p\n",
151 V_VT( &startup_info
), type
, V_UNKNOWN( &startup_info
));
153 if (out
&& (hr
= IWbemClassObject_SpawnInstance( sig
, 0, &out_params
)))
159 memset( &si
, 0, sizeof(si
) );
162 if (V_VT( &command_line
) == VT_BSTR
&& V_BSTR( &command_line
))
164 bret
= CreateProcessW( NULL
, V_BSTR( &command_line
), NULL
, NULL
, FALSE
, 0L,
165 V_VT( ¤t_directory
) == VT_BSTR
? V_BSTR( ¤t_directory
) : NULL
,
167 TRACE( "CreateProcessW ret %d, GetLastError() %lu\n", bret
, GetLastError() );
170 CloseHandle( pi
.hThread
);
171 CloseHandle( pi
.hProcess
);
176 switch (GetLastError())
178 case ERROR_FILE_NOT_FOUND
:
179 case ERROR_PATH_NOT_FOUND
:
182 case ERROR_ACCESS_DENIED
:
202 V_UI4( &v
) = pi
.dwProcessId
;
204 if (bret
&& (ret
= IWbemClassObject_Put( out_params
, L
"ProcessId", 0, &v
, 0 ))) goto done
;
207 if ((ret
= IWbemClassObject_Put( out_params
, L
"ReturnValue", 0, &v
, 0 ))) goto done
;
210 IWbemClassObject_AddRef( out_params
);
215 IWbemClassObject_Release( sig
);
216 if (out_params
) IWbemClassObject_Release( out_params
);
217 VariantClear( &command_line
);
218 VariantClear( ¤t_directory
);
219 VariantClear( &startup_info
);
220 TRACE( "ret %#lx\n", ret
);