mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 17:05:46 +00:00
[WBEMPROX]
* Sync with Wine 1.7.27. CORE-8540 svn path=/trunk/; revision=64611
This commit is contained in:
parent
df3a6889ba
commit
cbbaf54b85
13 changed files with 1025 additions and 878 deletions
|
@ -14,6 +14,7 @@ list(APPEND SOURCE
|
|||
qualifier.c
|
||||
query.c
|
||||
reg.c
|
||||
security.c
|
||||
service.c
|
||||
services.c
|
||||
table.c
|
||||
|
|
|
@ -69,6 +69,8 @@ static const WCHAR class_process_getowner_outW[] =
|
|||
'N','E','R','_','O','U','T',0};
|
||||
static const WCHAR class_processorW[] =
|
||||
{'W','i','n','3','2','_','P','r','o','c','e','s','s','o','r',0};
|
||||
static const WCHAR class_processor2W[] =
|
||||
{'C','I','M','_','P','r','o','c','e','s','s','o','r',0};
|
||||
static const WCHAR class_sounddeviceW[] =
|
||||
{'W','i','n','3','2','_','S','o','u','n','d','D','e','v','i','c','e',0};
|
||||
static const WCHAR class_videocontrollerW[] =
|
||||
|
@ -114,6 +116,8 @@ static const WCHAR prop_csdversionW[] =
|
|||
{'C','S','D','V','e','r','s','i','o','n',0};
|
||||
static const WCHAR prop_currentbitsperpixelW[] =
|
||||
{'C','u','r','r','e','n','t','B','i','t','s','P','e','r','P','i','x','e','l',0};
|
||||
static const WCHAR prop_currentclockspeedW[] =
|
||||
{'C','u','r','r','e','n','t','C','l','o','c','k','S','p','e','e','d',0};
|
||||
static const WCHAR prop_currenthorizontalresW[] =
|
||||
{'C','u','r','r','e','n','t','H','o','r','i','z','o','n','t','a','l','R','e','s','o','l','u','t','i','o','n',0};
|
||||
static const WCHAR prop_currentverticalresW[] =
|
||||
|
@ -294,7 +298,7 @@ static const struct column col_compsys[] =
|
|||
{
|
||||
{ prop_descriptionW, CIM_STRING },
|
||||
{ prop_domainW, CIM_STRING },
|
||||
{ prop_domainroleW, CIM_UINT16 },
|
||||
{ prop_domainroleW, CIM_UINT16, VT_I4 },
|
||||
{ prop_manufacturerW, CIM_STRING },
|
||||
{ prop_modelW, CIM_STRING },
|
||||
{ prop_nameW, CIM_STRING|COL_FLAG_DYNAMIC },
|
||||
|
@ -361,8 +365,8 @@ static const struct column col_networkadapter[] =
|
|||
};
|
||||
static const struct column col_networkadapterconfig[] =
|
||||
{
|
||||
{ prop_indexW, CIM_UINT32|COL_FLAG_KEY },
|
||||
{ prop_ipconnectionmetricW, CIM_UINT32 },
|
||||
{ prop_indexW, CIM_UINT32|COL_FLAG_KEY, VT_I4 },
|
||||
{ prop_ipconnectionmetricW, CIM_UINT32, VT_I4 },
|
||||
{ prop_ipenabledW, CIM_BOOLEAN },
|
||||
{ prop_macaddressW, CIM_STRING|COL_FLAG_DYNAMIC }
|
||||
};
|
||||
|
@ -425,6 +429,7 @@ static const struct column col_processor[] =
|
|||
{
|
||||
{ prop_addresswidthW, CIM_UINT16, VT_I4 },
|
||||
{ prop_cpustatusW, CIM_UINT16 },
|
||||
{ prop_currentclockspeedW, CIM_UINT32, VT_I4 },
|
||||
{ prop_deviceidW, CIM_STRING|COL_FLAG_DYNAMIC|COL_FLAG_KEY },
|
||||
{ prop_familyW, CIM_UINT16, VT_I4 },
|
||||
{ prop_manufacturerW, CIM_STRING|COL_FLAG_DYNAMIC },
|
||||
|
@ -473,14 +478,19 @@ static const struct column col_stdregprov[] =
|
|||
{ method_enumvaluesW, CIM_FLAG_ARRAY|COL_FLAG_METHOD },
|
||||
{ method_getstringvalueW, CIM_FLAG_ARRAY|COL_FLAG_METHOD }
|
||||
};
|
||||
static const struct column col_systemsecurity[] =
|
||||
{
|
||||
{ method_getsdW, CIM_FLAG_ARRAY|COL_FLAG_METHOD },
|
||||
{ method_setsdW, CIM_FLAG_ARRAY|COL_FLAG_METHOD },
|
||||
};
|
||||
static const struct column col_videocontroller[] =
|
||||
{
|
||||
{ prop_adapterdactypeW, CIM_STRING },
|
||||
{ prop_adapterramW, CIM_UINT32, VT_I4 },
|
||||
{ prop_availabilityW, CIM_UINT16 },
|
||||
{ prop_currentbitsperpixelW, CIM_UINT32 },
|
||||
{ prop_currenthorizontalresW, CIM_UINT32 },
|
||||
{ prop_currentverticalresW, CIM_UINT32 },
|
||||
{ prop_currentbitsperpixelW, CIM_UINT32, VT_I4 },
|
||||
{ prop_currenthorizontalresW, CIM_UINT32, VT_I4 },
|
||||
{ prop_currentverticalresW, CIM_UINT32, VT_I4 },
|
||||
{ prop_descriptionW, CIM_STRING|COL_FLAG_DYNAMIC },
|
||||
{ prop_deviceidW, CIM_STRING|COL_FLAG_KEY },
|
||||
{ prop_nameW, CIM_STRING|COL_FLAG_DYNAMIC },
|
||||
|
@ -731,6 +741,7 @@ struct record_processor
|
|||
{
|
||||
UINT16 addresswidth;
|
||||
UINT16 cpu_status;
|
||||
UINT32 currentclockspeed;
|
||||
const WCHAR *device_id;
|
||||
UINT16 family;
|
||||
const WCHAR *manufacturer;
|
||||
|
@ -779,6 +790,11 @@ struct record_stdregprov
|
|||
class_method *enumvalues;
|
||||
class_method *getstringvalue;
|
||||
};
|
||||
struct record_systemsecurity
|
||||
{
|
||||
class_method *getsd;
|
||||
class_method *setsd;
|
||||
};
|
||||
struct record_videocontroller
|
||||
{
|
||||
const WCHAR *adapter_dactype;
|
||||
|
@ -825,7 +841,11 @@ static const struct record_param data_param[] =
|
|||
{ class_stdregprovW, method_getstringvalueW, 1, param_subkeynameW, CIM_STRING },
|
||||
{ class_stdregprovW, method_getstringvalueW, 1, param_valuenameW, CIM_STRING },
|
||||
{ class_stdregprovW, method_getstringvalueW, -1, param_returnvalueW, CIM_UINT32, VT_I4 },
|
||||
{ class_stdregprovW, method_getstringvalueW, -1, param_valueW, CIM_STRING }
|
||||
{ class_stdregprovW, method_getstringvalueW, -1, param_valueW, CIM_STRING },
|
||||
{ class_systemsecurityW, method_getsdW, -1, param_returnvalueW, CIM_UINT32, VT_I4 },
|
||||
{ class_systemsecurityW, method_getsdW, -1, param_sdW, CIM_UINT8|CIM_FLAG_ARRAY },
|
||||
{ class_systemsecurityW, method_setsdW, 1, param_sdW, CIM_UINT8|CIM_FLAG_ARRAY },
|
||||
{ class_systemsecurityW, method_setsdW, -1, param_returnvalueW, CIM_UINT32, VT_I4 },
|
||||
};
|
||||
|
||||
#define FLAVOR_ID (WBEM_FLAVOR_FLAG_PROPAGATE_TO_INSTANCE | WBEM_FLAVOR_NOT_OVERRIDABLE |\
|
||||
|
@ -848,6 +868,10 @@ static const struct record_stdregprov data_stdregprov[] =
|
|||
{
|
||||
{ reg_enum_key, reg_enum_values, reg_get_stringvalue }
|
||||
};
|
||||
static const struct record_systemsecurity data_systemsecurity[] =
|
||||
{
|
||||
{ security_get_sd, security_set_sd }
|
||||
};
|
||||
|
||||
/* check if row matches condition and update status */
|
||||
static BOOL match_row( const struct table *table, UINT row, const struct expr *cond, enum fill_status *status )
|
||||
|
@ -1949,7 +1973,7 @@ static void get_processor_name( WCHAR *name )
|
|||
regs_to_str( regs, 16, name + 32 );
|
||||
}
|
||||
}
|
||||
static UINT get_processor_maxclockspeed( void )
|
||||
static UINT get_processor_currentclockspeed( UINT index )
|
||||
{
|
||||
PROCESSOR_POWER_INFORMATION *info;
|
||||
UINT ret = 1000, size = get_processor_count() * sizeof(PROCESSOR_POWER_INFORMATION);
|
||||
|
@ -1958,7 +1982,21 @@ static UINT get_processor_maxclockspeed( void )
|
|||
if ((info = heap_alloc( size )))
|
||||
{
|
||||
status = NtPowerInformation( ProcessorInformation, NULL, 0, info, size );
|
||||
if (!status) ret = info[0].MaxMhz;
|
||||
if (!status) ret = info[index].CurrentMhz;
|
||||
heap_free( info );
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
static UINT get_processor_maxclockspeed( UINT index )
|
||||
{
|
||||
PROCESSOR_POWER_INFORMATION *info;
|
||||
UINT ret = 1000, size = get_processor_count() * sizeof(PROCESSOR_POWER_INFORMATION);
|
||||
NTSTATUS status;
|
||||
|
||||
if ((info = heap_alloc( size )))
|
||||
{
|
||||
status = NtPowerInformation( ProcessorInformation, NULL, 0, info, size );
|
||||
if (!status) ret = info[index].MaxMhz;
|
||||
heap_free( info );
|
||||
}
|
||||
return ret;
|
||||
|
@ -1976,7 +2014,7 @@ static enum fill_status fill_processor( struct table *table, const struct expr *
|
|||
static const WCHAR fmtW[] = {'C','P','U','%','u',0};
|
||||
WCHAR device_id[14], processor_id[17], manufacturer[13], name[49] = {0};
|
||||
struct record_processor *rec;
|
||||
UINT i, offset = 0, maxclockspeed, num_cores, num_logical_processors, count = get_processor_count();
|
||||
UINT i, offset = 0, num_cores, num_logical_processors, count = get_processor_count();
|
||||
enum fill_status status = FILL_STATUS_UNFILTERED;
|
||||
|
||||
if (!resize_table( table, count, sizeof(*rec) )) return FILL_STATUS_FAILED;
|
||||
|
@ -1985,7 +2023,6 @@ static enum fill_status fill_processor( struct table *table, const struct expr *
|
|||
get_processor_manufacturer( manufacturer );
|
||||
get_processor_name( name );
|
||||
|
||||
maxclockspeed = get_processor_maxclockspeed();
|
||||
num_logical_processors = get_logical_processor_count( &num_cores ) / count;
|
||||
num_cores /= count;
|
||||
|
||||
|
@ -1994,11 +2031,12 @@ static enum fill_status fill_processor( struct table *table, const struct expr *
|
|||
rec = (struct record_processor *)(table->data + offset);
|
||||
rec->addresswidth = get_osarchitecture() == os_32bitW ? 32 : 64;
|
||||
rec->cpu_status = 1; /* CPU Enabled */
|
||||
rec->currentclockspeed = get_processor_currentclockspeed( i );
|
||||
sprintfW( device_id, fmtW, i );
|
||||
rec->device_id = heap_strdupW( device_id );
|
||||
rec->family = 2; /* Unknown */
|
||||
rec->manufacturer = heap_strdupW( manufacturer );
|
||||
rec->maxclockspeed = maxclockspeed;
|
||||
rec->maxclockspeed = get_processor_maxclockspeed( i );
|
||||
rec->name = heap_strdupW( name );
|
||||
rec->num_cores = num_cores;
|
||||
rec->num_logical_processors = num_logical_processors;
|
||||
|
@ -2380,10 +2418,12 @@ static struct table builtin_classes[] =
|
|||
{ class_physicalmemoryW, SIZEOF(col_physicalmemory), col_physicalmemory, 0, 0, NULL, fill_physicalmemory },
|
||||
{ class_processW, SIZEOF(col_process), col_process, 0, 0, NULL, fill_process },
|
||||
{ class_processorW, SIZEOF(col_processor), col_processor, 0, 0, NULL, fill_processor },
|
||||
{ class_processor2W, SIZEOF(col_processor), col_processor, 0, 0, NULL, fill_processor },
|
||||
{ class_qualifiersW, SIZEOF(col_qualifier), col_qualifier, SIZEOF(data_qualifier), 0, (BYTE *)data_qualifier },
|
||||
{ class_serviceW, SIZEOF(col_service), col_service, 0, 0, NULL, fill_service },
|
||||
{ class_sounddeviceW, SIZEOF(col_sounddevice), col_sounddevice, SIZEOF(data_sounddevice), 0, (BYTE *)data_sounddevice },
|
||||
{ class_stdregprovW, SIZEOF(col_stdregprov), col_stdregprov, SIZEOF(data_stdregprov), 0, (BYTE *)data_stdregprov },
|
||||
{ class_systemsecurityW, SIZEOF(col_systemsecurity), col_systemsecurity, SIZEOF(data_systemsecurity), 0, (BYTE *)data_systemsecurity },
|
||||
{ class_videocontrollerW, SIZEOF(col_videocontroller), col_videocontroller, 0, 0, NULL, fill_videocontroller }
|
||||
};
|
||||
|
||||
|
|
|
@ -498,23 +498,30 @@ static HRESULT WINAPI class_object_Next(
|
|||
CIMTYPE *pType,
|
||||
LONG *plFlavor )
|
||||
{
|
||||
struct class_object *co = impl_from_IWbemClassObject( iface );
|
||||
struct enum_class_object *ec = impl_from_IEnumWbemClassObject( co->iter );
|
||||
struct view *view = ec->query->view;
|
||||
BSTR property;
|
||||
struct class_object *obj = impl_from_IWbemClassObject( iface );
|
||||
struct enum_class_object *iter = impl_from_IEnumWbemClassObject( obj->iter );
|
||||
struct view *view = iter->query->view;
|
||||
BSTR prop;
|
||||
HRESULT hr;
|
||||
UINT i;
|
||||
|
||||
TRACE("%p, %08x, %p, %p, %p, %p\n", iface, lFlags, strName, pVal, pType, plFlavor);
|
||||
|
||||
if (!(property = get_property_name( co->name, co->index_property ))) return WBEM_S_NO_MORE_DATA;
|
||||
if ((hr = get_propval( view, co->index, property, pVal, pType, plFlavor )) != S_OK)
|
||||
for (i = obj->index_property; i < view->table->num_cols; i++)
|
||||
{
|
||||
SysFreeString( property );
|
||||
return hr;
|
||||
if (is_method( view->table, i )) continue;
|
||||
if (!is_selected_prop( view, view->table->columns[i].name )) continue;
|
||||
if (!(prop = SysAllocString( view->table->columns[i].name ))) return E_OUTOFMEMORY;
|
||||
if ((hr = get_propval( view, obj->index, prop, pVal, pType, plFlavor )) != S_OK)
|
||||
{
|
||||
SysFreeString( prop );
|
||||
return hr;
|
||||
}
|
||||
obj->index_property = i + 1;
|
||||
*strName = prop;
|
||||
return S_OK;
|
||||
}
|
||||
*strName = property;
|
||||
co->index_property++;
|
||||
return S_OK;
|
||||
return WBEM_S_NO_MORE_DATA;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI class_object_EndEnumeration(
|
||||
|
|
|
@ -105,8 +105,6 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
|||
|
||||
switch (fdwReason)
|
||||
{
|
||||
case DLL_WINE_PREATTACH:
|
||||
return FALSE; /* prefer native version */
|
||||
case DLL_PROCESS_ATTACH:
|
||||
instance = hinstDLL;
|
||||
DisableThreadLibraryCalls(hinstDLL);
|
||||
|
|
|
@ -54,7 +54,7 @@ done:
|
|||
HRESULT process_get_owner( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out )
|
||||
{
|
||||
VARIANT user, domain, retval;
|
||||
IWbemClassObject *sig;
|
||||
IWbemClassObject *sig, *out_params = NULL;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("%p, %p, %p\n", obj, in, out);
|
||||
|
@ -62,29 +62,40 @@ HRESULT process_get_owner( IWbemClassObject *obj, IWbemClassObject *in, IWbemCla
|
|||
hr = create_signature( class_processW, method_getownerW, PARAM_OUT, &sig );
|
||||
if (hr != S_OK) return hr;
|
||||
|
||||
hr = IWbemClassObject_SpawnInstance( sig, 0, out );
|
||||
if (hr != S_OK)
|
||||
if (out)
|
||||
{
|
||||
IWbemClassObject_Release( sig );
|
||||
return hr;
|
||||
hr = IWbemClassObject_SpawnInstance( sig, 0, &out_params );
|
||||
if (hr != S_OK)
|
||||
{
|
||||
IWbemClassObject_Release( sig );
|
||||
return hr;
|
||||
}
|
||||
}
|
||||
VariantInit( &user );
|
||||
VariantInit( &domain );
|
||||
hr = get_owner( &user, &domain, &retval );
|
||||
if (hr != S_OK) goto done;
|
||||
if (!V_UI4( &retval ))
|
||||
if (out_params)
|
||||
{
|
||||
hr = IWbemClassObject_Put( *out, param_userW, 0, &user, CIM_STRING );
|
||||
if (hr != S_OK) goto done;
|
||||
hr = IWbemClassObject_Put( *out, param_domainW, 0, &domain, CIM_STRING );
|
||||
if (hr != S_OK) goto done;
|
||||
if (!V_UI4( &retval ))
|
||||
{
|
||||
hr = IWbemClassObject_Put( out_params, param_userW, 0, &user, CIM_STRING );
|
||||
if (hr != S_OK) goto done;
|
||||
hr = IWbemClassObject_Put( out_params, param_domainW, 0, &domain, CIM_STRING );
|
||||
if (hr != S_OK) goto done;
|
||||
}
|
||||
hr = IWbemClassObject_Put( out_params, param_returnvalueW, 0, &retval, CIM_UINT32 );
|
||||
}
|
||||
hr = IWbemClassObject_Put( *out, param_returnvalueW, 0, &retval, CIM_UINT32 );
|
||||
|
||||
done:
|
||||
VariantClear( &user );
|
||||
VariantClear( &domain );
|
||||
IWbemClassObject_Release( sig );
|
||||
if (hr != S_OK) IWbemClassObject_Release( *out );
|
||||
if (hr == S_OK && out)
|
||||
{
|
||||
*out = out_params;
|
||||
IWbemClassObject_AddRef( out_params );
|
||||
}
|
||||
if (out_params) IWbemClassObject_Release( out_params );
|
||||
return hr;
|
||||
}
|
||||
|
|
|
@ -412,7 +412,7 @@ done:
|
|||
return hr;
|
||||
}
|
||||
|
||||
static BOOL is_selected_prop( const struct view *view, const WCHAR *name )
|
||||
BOOL is_selected_prop( const struct view *view, const WCHAR *name )
|
||||
{
|
||||
const struct property *prop = view->proplist;
|
||||
|
||||
|
@ -551,7 +551,7 @@ done:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static inline BOOL is_method( const struct table *table, UINT column )
|
||||
BOOL is_method( const struct table *table, UINT column )
|
||||
{
|
||||
return table->columns[column].type & COL_FLAG_METHOD;
|
||||
}
|
||||
|
@ -652,6 +652,8 @@ VARTYPE to_vartype( CIMTYPE type )
|
|||
case CIM_BOOLEAN: return VT_BOOL;
|
||||
case CIM_STRING:
|
||||
case CIM_DATETIME: return VT_BSTR;
|
||||
case CIM_SINT8: return VT_I1;
|
||||
case CIM_UINT8: return VT_UI1;
|
||||
case CIM_SINT16: return VT_I2;
|
||||
case CIM_UINT16: return VT_UI2;
|
||||
case CIM_SINT32: return VT_I4;
|
||||
|
@ -712,6 +714,12 @@ void set_variant( VARTYPE type, LONGLONG val, void *val_ptr, VARIANT *ret )
|
|||
case VT_BSTR:
|
||||
V_BSTR( ret ) = val_ptr;
|
||||
break;
|
||||
case VT_I1:
|
||||
V_I1( ret ) = val;
|
||||
break;
|
||||
case VT_UI1:
|
||||
V_UI1( ret ) = val;
|
||||
break;
|
||||
case VT_I2:
|
||||
V_I2( ret ) = val;
|
||||
break;
|
||||
|
@ -776,6 +784,12 @@ HRESULT get_propval( const struct view *view, UINT index, const WCHAR *name, VAR
|
|||
else
|
||||
vartype = VT_NULL;
|
||||
break;
|
||||
case CIM_SINT8:
|
||||
if (!vartype) vartype = VT_I1;
|
||||
break;
|
||||
case CIM_UINT8:
|
||||
if (!vartype) vartype = VT_UI1;
|
||||
break;
|
||||
case CIM_SINT16:
|
||||
if (!vartype) vartype = VT_I2;
|
||||
break;
|
||||
|
@ -814,6 +828,8 @@ static CIMTYPE to_cimtype( VARTYPE type )
|
|||
{
|
||||
case VT_BOOL: return CIM_BOOLEAN;
|
||||
case VT_BSTR: return CIM_STRING;
|
||||
case VT_I1: return CIM_SINT8;
|
||||
case VT_UI1: return CIM_UINT8;
|
||||
case VT_I2: return CIM_SINT16;
|
||||
case VT_UI2: return CIM_UINT16;
|
||||
case VT_I4: return CIM_SINT32;
|
||||
|
@ -951,28 +967,30 @@ HRESULT get_properties( const struct view *view, LONG flags, SAFEARRAY **props )
|
|||
{
|
||||
SAFEARRAY *sa;
|
||||
BSTR str;
|
||||
LONG i;
|
||||
UINT num_props = count_properties( view );
|
||||
UINT i, num_props = count_selected_properties( view );
|
||||
LONG j;
|
||||
|
||||
if (!(sa = SafeArrayCreateVector( VT_BSTR, 0, num_props ))) return E_OUTOFMEMORY;
|
||||
|
||||
for (i = 0; i < view->table->num_cols; i++)
|
||||
for (i = 0, j = 0; i < view->table->num_cols; i++)
|
||||
{
|
||||
BOOL is_system;
|
||||
|
||||
if (is_method( view->table, i )) continue;
|
||||
if (!is_selected_prop( view, view->table->columns[i].name )) continue;
|
||||
|
||||
is_system = is_system_prop( view->table->columns[i].name );
|
||||
if ((flags & WBEM_FLAG_NONSYSTEM_ONLY) && is_system) continue;
|
||||
else if ((flags & WBEM_FLAG_SYSTEM_ONLY) && !is_system) continue;
|
||||
|
||||
str = SysAllocString( view->table->columns[i].name );
|
||||
if (!str || SafeArrayPutElement( sa, &i, str ) != S_OK)
|
||||
if (!str || SafeArrayPutElement( sa, &j, str ) != S_OK)
|
||||
{
|
||||
SysFreeString( str );
|
||||
SafeArrayDestroy( sa );
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
j++;
|
||||
}
|
||||
*props = sa;
|
||||
return S_OK;
|
||||
|
|
|
@ -114,7 +114,7 @@ static HRESULT enum_key( HKEY root, const WCHAR *subkey, VARIANT *names, VARIANT
|
|||
HRESULT reg_enum_key( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out )
|
||||
{
|
||||
VARIANT defkey, subkey, names, retval;
|
||||
IWbemClassObject *sig;
|
||||
IWbemClassObject *sig, *out_params = NULL;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("%p, %p\n", in, out);
|
||||
|
@ -130,28 +130,39 @@ HRESULT reg_enum_key( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObj
|
|||
VariantClear( &subkey );
|
||||
return hr;
|
||||
}
|
||||
hr = IWbemClassObject_SpawnInstance( sig, 0, out );
|
||||
if (hr != S_OK)
|
||||
if (out)
|
||||
{
|
||||
VariantClear( &subkey );
|
||||
IWbemClassObject_Release( sig );
|
||||
return hr;
|
||||
hr = IWbemClassObject_SpawnInstance( sig, 0, &out_params );
|
||||
if (hr != S_OK)
|
||||
{
|
||||
VariantClear( &subkey );
|
||||
IWbemClassObject_Release( sig );
|
||||
return hr;
|
||||
}
|
||||
}
|
||||
VariantInit( &names );
|
||||
hr = enum_key( (HKEY)(INT_PTR)V_I4(&defkey), V_BSTR(&subkey), &names, &retval );
|
||||
if (hr != S_OK) goto done;
|
||||
if (!V_UI4( &retval ))
|
||||
if (out_params)
|
||||
{
|
||||
hr = IWbemClassObject_Put( *out, param_namesW, 0, &names, CIM_STRING|CIM_FLAG_ARRAY );
|
||||
if (hr != S_OK) goto done;
|
||||
if (!V_UI4( &retval ))
|
||||
{
|
||||
hr = IWbemClassObject_Put( out_params, param_namesW, 0, &names, CIM_STRING|CIM_FLAG_ARRAY );
|
||||
if (hr != S_OK) goto done;
|
||||
}
|
||||
hr = IWbemClassObject_Put( out_params, param_returnvalueW, 0, &retval, CIM_UINT32 );
|
||||
}
|
||||
hr = IWbemClassObject_Put( *out, param_returnvalueW, 0, &retval, CIM_UINT32 );
|
||||
|
||||
done:
|
||||
VariantClear( &names );
|
||||
VariantClear( &subkey );
|
||||
IWbemClassObject_Release( sig );
|
||||
if (hr != S_OK) IWbemClassObject_Release( *out );
|
||||
if (hr == S_OK && out)
|
||||
{
|
||||
*out = out_params;
|
||||
IWbemClassObject_AddRef( out_params );
|
||||
}
|
||||
if (out_params) IWbemClassObject_Release( out_params );
|
||||
return hr;
|
||||
}
|
||||
|
||||
|
@ -212,7 +223,7 @@ done:
|
|||
HRESULT reg_enum_values( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out )
|
||||
{
|
||||
VARIANT defkey, subkey, names, types, retval;
|
||||
IWbemClassObject *sig;
|
||||
IWbemClassObject *sig, *out_params = NULL;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("%p, %p\n", in, out);
|
||||
|
@ -228,32 +239,43 @@ HRESULT reg_enum_values( IWbemClassObject *obj, IWbemClassObject *in, IWbemClass
|
|||
VariantClear( &subkey );
|
||||
return hr;
|
||||
}
|
||||
hr = IWbemClassObject_SpawnInstance( sig, 0, out );
|
||||
if (hr != S_OK)
|
||||
if (out)
|
||||
{
|
||||
VariantClear( &subkey );
|
||||
IWbemClassObject_Release( sig );
|
||||
return hr;
|
||||
hr = IWbemClassObject_SpawnInstance( sig, 0, &out_params );
|
||||
if (hr != S_OK)
|
||||
{
|
||||
VariantClear( &subkey );
|
||||
IWbemClassObject_Release( sig );
|
||||
return hr;
|
||||
}
|
||||
}
|
||||
VariantInit( &names );
|
||||
VariantInit( &types );
|
||||
hr = enum_values( (HKEY)(INT_PTR)V_I4(&defkey), V_BSTR(&subkey), &names, &types, &retval );
|
||||
if (hr != S_OK) goto done;
|
||||
if (!V_UI4( &retval ))
|
||||
if (out_params)
|
||||
{
|
||||
hr = IWbemClassObject_Put( *out, param_namesW, 0, &names, CIM_STRING|CIM_FLAG_ARRAY );
|
||||
if (hr != S_OK) goto done;
|
||||
hr = IWbemClassObject_Put( *out, param_typesW, 0, &types, CIM_SINT32|CIM_FLAG_ARRAY );
|
||||
if (hr != S_OK) goto done;
|
||||
if (!V_UI4( &retval ))
|
||||
{
|
||||
hr = IWbemClassObject_Put( out_params, param_namesW, 0, &names, CIM_STRING|CIM_FLAG_ARRAY );
|
||||
if (hr != S_OK) goto done;
|
||||
hr = IWbemClassObject_Put( out_params, param_typesW, 0, &types, CIM_SINT32|CIM_FLAG_ARRAY );
|
||||
if (hr != S_OK) goto done;
|
||||
}
|
||||
hr = IWbemClassObject_Put( out_params, param_returnvalueW, 0, &retval, CIM_UINT32 );
|
||||
}
|
||||
hr = IWbemClassObject_Put( *out, param_returnvalueW, 0, &retval, CIM_UINT32 );
|
||||
|
||||
done:
|
||||
VariantClear( &types );
|
||||
VariantClear( &names );
|
||||
VariantClear( &subkey );
|
||||
IWbemClassObject_Release( sig );
|
||||
if (hr != S_OK) IWbemClassObject_Release( *out );
|
||||
if (hr == S_OK && out)
|
||||
{
|
||||
*out = out_params;
|
||||
IWbemClassObject_AddRef( out_params );
|
||||
}
|
||||
if (out_params) IWbemClassObject_Release( out_params );
|
||||
return hr;
|
||||
}
|
||||
|
||||
|
@ -284,7 +306,7 @@ done:
|
|||
HRESULT reg_get_stringvalue( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out )
|
||||
{
|
||||
VARIANT defkey, subkey, name, value, retval;
|
||||
IWbemClassObject *sig;
|
||||
IWbemClassObject *sig, *out_params = NULL;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("%p, %p\n", in, out);
|
||||
|
@ -303,28 +325,39 @@ HRESULT reg_get_stringvalue( IWbemClassObject *obj, IWbemClassObject *in, IWbemC
|
|||
VariantClear( &subkey );
|
||||
return hr;
|
||||
}
|
||||
hr = IWbemClassObject_SpawnInstance( sig, 0, out );
|
||||
if (hr != S_OK)
|
||||
if (out)
|
||||
{
|
||||
VariantClear( &name );
|
||||
VariantClear( &subkey );
|
||||
IWbemClassObject_Release( sig );
|
||||
return hr;
|
||||
hr = IWbemClassObject_SpawnInstance( sig, 0, &out_params );
|
||||
if (hr != S_OK)
|
||||
{
|
||||
VariantClear( &name );
|
||||
VariantClear( &subkey );
|
||||
IWbemClassObject_Release( sig );
|
||||
return hr;
|
||||
}
|
||||
}
|
||||
VariantInit( &value );
|
||||
hr = get_stringvalue( (HKEY)(INT_PTR)V_I4(&defkey), V_BSTR(&subkey), V_BSTR(&name), &value, &retval );
|
||||
if (hr != S_OK) goto done;
|
||||
if (!V_UI4( &retval ))
|
||||
if (out_params)
|
||||
{
|
||||
hr = IWbemClassObject_Put( *out, param_valueW, 0, &value, CIM_STRING );
|
||||
if (hr != S_OK) goto done;
|
||||
if (!V_UI4( &retval ))
|
||||
{
|
||||
hr = IWbemClassObject_Put( out_params, param_valueW, 0, &value, CIM_STRING );
|
||||
if (hr != S_OK) goto done;
|
||||
}
|
||||
hr = IWbemClassObject_Put( out_params, param_returnvalueW, 0, &retval, CIM_UINT32 );
|
||||
}
|
||||
hr = IWbemClassObject_Put( *out, param_returnvalueW, 0, &retval, CIM_UINT32 );
|
||||
|
||||
done:
|
||||
VariantClear( &name );
|
||||
VariantClear( &subkey );
|
||||
IWbemClassObject_Release( sig );
|
||||
if (hr != S_OK) IWbemClassObject_Release( *out );
|
||||
if (hr == S_OK && out)
|
||||
{
|
||||
*out = out_params;
|
||||
IWbemClassObject_AddRef( out_params );
|
||||
}
|
||||
if (out_params) IWbemClassObject_Release( out_params );
|
||||
return hr;
|
||||
}
|
||||
|
|
206
reactos/dll/win32/wbemprox/security.c
Normal file
206
reactos/dll/win32/wbemprox/security.c
Normal file
|
@ -0,0 +1,206 @@
|
|||
/*
|
||||
* __SystemSecurity implementation
|
||||
*
|
||||
* Copyright 2014 Vincent Povirk for CodeWeavers
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include "wbemprox_private.h"
|
||||
|
||||
#include <iads.h>
|
||||
|
||||
static HRESULT to_byte_array( void *data, DWORD size, VARIANT *var )
|
||||
{
|
||||
SAFEARRAY *sa;
|
||||
void *sadata;
|
||||
HRESULT hr;
|
||||
|
||||
if (!(sa = SafeArrayCreateVector( VT_UI1, 0, size ))) return E_OUTOFMEMORY;
|
||||
|
||||
hr = SafeArrayAccessData( sa, &sadata );
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
memcpy( sadata, data, size );
|
||||
|
||||
SafeArrayUnaccessData( sa );
|
||||
}
|
||||
else
|
||||
{
|
||||
SafeArrayDestroy( sa );
|
||||
return hr;
|
||||
}
|
||||
|
||||
set_variant( VT_UI1|VT_ARRAY, 0, sa, var );
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT get_sd( SECURITY_DESCRIPTOR **sd, DWORD *size )
|
||||
{
|
||||
BYTE sid_admin_buffer[SECURITY_MAX_SID_SIZE];
|
||||
SID *sid_admin = (SID*)sid_admin_buffer;
|
||||
BYTE sid_network_buffer[SECURITY_MAX_SID_SIZE];
|
||||
SID *sid_network = (SID*)sid_network_buffer;
|
||||
BYTE sid_local_buffer[SECURITY_MAX_SID_SIZE];
|
||||
SID *sid_local = (SID*)sid_local_buffer;
|
||||
BYTE sid_users_buffer[SECURITY_MAX_SID_SIZE];
|
||||
SID *sid_users = (SID*)sid_users_buffer;
|
||||
BYTE acl_buffer[sizeof(ACL) + 4 * (sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD) + SECURITY_MAX_SID_SIZE)];
|
||||
ACL *acl = (ACL*)acl_buffer;
|
||||
DWORD sid_size;
|
||||
SECURITY_DESCRIPTOR absolute_sd;
|
||||
HRESULT hr = S_OK;
|
||||
|
||||
sid_size = sizeof(sid_admin_buffer);
|
||||
CreateWellKnownSid( WinBuiltinAdministratorsSid, NULL, sid_admin, &sid_size );
|
||||
|
||||
sid_size = sizeof(sid_network_buffer);
|
||||
CreateWellKnownSid( WinNetworkServiceSid, NULL, sid_network, &sid_size );
|
||||
|
||||
sid_size = sizeof(sid_local_buffer);
|
||||
CreateWellKnownSid( WinLocalServiceSid, NULL, sid_local, &sid_size );
|
||||
|
||||
sid_size = sizeof(sid_users_buffer);
|
||||
CreateWellKnownSid( WinAuthenticatedUserSid, NULL, sid_users, &sid_size );
|
||||
|
||||
InitializeAcl( acl, sizeof(acl_buffer), ACL_REVISION );
|
||||
|
||||
AddAccessAllowedAceEx( acl, ACL_REVISION, CONTAINER_INHERIT_ACE|INHERITED_ACE,
|
||||
ADS_RIGHT_DS_CREATE_CHILD|ADS_RIGHT_DS_DELETE_CHILD|ADS_RIGHT_ACTRL_DS_LIST|ADS_RIGHT_DS_SELF|
|
||||
ADS_RIGHT_DS_READ_PROP|ADS_RIGHT_DS_WRITE_PROP|READ_CONTROL|WRITE_DAC,
|
||||
sid_admin );
|
||||
|
||||
AddAccessAllowedAceEx( acl, ACL_REVISION, CONTAINER_INHERIT_ACE|INHERITED_ACE,
|
||||
ADS_RIGHT_DS_CREATE_CHILD|ADS_RIGHT_DS_DELETE_CHILD|ADS_RIGHT_DS_READ_PROP,
|
||||
sid_network );
|
||||
|
||||
AddAccessAllowedAceEx( acl, ACL_REVISION, CONTAINER_INHERIT_ACE|INHERITED_ACE,
|
||||
ADS_RIGHT_DS_CREATE_CHILD|ADS_RIGHT_DS_DELETE_CHILD|ADS_RIGHT_DS_READ_PROP,
|
||||
sid_local );
|
||||
|
||||
AddAccessAllowedAceEx( acl, ACL_REVISION, CONTAINER_INHERIT_ACE|INHERITED_ACE,
|
||||
ADS_RIGHT_DS_CREATE_CHILD|ADS_RIGHT_DS_DELETE_CHILD|ADS_RIGHT_DS_READ_PROP,
|
||||
sid_users );
|
||||
|
||||
InitializeSecurityDescriptor( &absolute_sd, SECURITY_DESCRIPTOR_REVISION );
|
||||
|
||||
SetSecurityDescriptorOwner( &absolute_sd, sid_admin, TRUE );
|
||||
SetSecurityDescriptorGroup( &absolute_sd, sid_admin, TRUE );
|
||||
SetSecurityDescriptorDacl( &absolute_sd, TRUE, acl, TRUE );
|
||||
|
||||
*size = GetSecurityDescriptorLength( &absolute_sd );
|
||||
|
||||
*sd = HeapAlloc( GetProcessHeap(), 0, *size );
|
||||
if (!*sd)
|
||||
hr = E_OUTOFMEMORY;
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
if (!MakeSelfRelativeSD(&absolute_sd, *sd, size))
|
||||
hr = E_FAIL;
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT security_get_sd( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out )
|
||||
{
|
||||
VARIANT var_sd, retval;
|
||||
IWbemClassObject *sig, *out_params = NULL;
|
||||
HRESULT hr, ret;
|
||||
SECURITY_DESCRIPTOR *sd;
|
||||
DWORD sd_size;
|
||||
|
||||
TRACE("%p, %p\n", in, out);
|
||||
|
||||
hr = create_signature( class_systemsecurityW, method_getsdW, PARAM_OUT, &sig );
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
hr = IWbemClassObject_SpawnInstance( sig, 0, &out_params );
|
||||
|
||||
IWbemClassObject_Release( sig );
|
||||
}
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
ret = get_sd( &sd, &sd_size );
|
||||
|
||||
if (SUCCEEDED(ret))
|
||||
{
|
||||
VariantInit( &var_sd );
|
||||
|
||||
hr = to_byte_array( sd, sd_size, &var_sd );
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
hr = IWbemClassObject_Put( out_params, param_sdW, 0, &var_sd, CIM_UINT8|CIM_FLAG_ARRAY );
|
||||
|
||||
HeapFree( GetProcessHeap(), 0, sd );
|
||||
VariantClear( &var_sd );
|
||||
}
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
set_variant( VT_UI4, ret, NULL, &retval );
|
||||
hr = IWbemClassObject_Put( out_params, param_returnvalueW, 0, &retval, CIM_UINT32 );
|
||||
}
|
||||
|
||||
if (SUCCEEDED(hr) && out)
|
||||
{
|
||||
*out = out_params;
|
||||
IWbemClassObject_AddRef( out_params );
|
||||
}
|
||||
|
||||
IWbemClassObject_Release( out_params );
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
|
||||
HRESULT security_set_sd( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out )
|
||||
{
|
||||
VARIANT retval;
|
||||
IWbemClassObject *sig, *out_params = NULL;
|
||||
HRESULT hr;
|
||||
|
||||
FIXME("stub\n");
|
||||
|
||||
hr = create_signature( class_systemsecurityW, method_setsdW, PARAM_OUT, &sig );
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
hr = IWbemClassObject_SpawnInstance( sig, 0, &out_params );
|
||||
|
||||
IWbemClassObject_Release( sig );
|
||||
}
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
set_variant( VT_UI4, S_OK, NULL, &retval );
|
||||
hr = IWbemClassObject_Put( out_params, param_returnvalueW, 0, &retval, CIM_UINT32 );
|
||||
|
||||
if (SUCCEEDED(hr) && out)
|
||||
{
|
||||
*out = out_params;
|
||||
IWbemClassObject_AddRef( out_params );
|
||||
}
|
||||
|
||||
IWbemClassObject_Release( out_params );
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
|
@ -67,7 +67,7 @@ done:
|
|||
HRESULT service_pause_service( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out )
|
||||
{
|
||||
VARIANT name, retval;
|
||||
IWbemClassObject *sig;
|
||||
IWbemClassObject *sig, *out_params = NULL;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("%p, %p, %p\n", obj, in, out);
|
||||
|
@ -81,28 +81,38 @@ HRESULT service_pause_service( IWbemClassObject *obj, IWbemClassObject *in, IWbe
|
|||
VariantClear( &name );
|
||||
return hr;
|
||||
}
|
||||
hr = IWbemClassObject_SpawnInstance( sig, 0, out );
|
||||
if (hr != S_OK)
|
||||
if (out)
|
||||
{
|
||||
VariantClear( &name );
|
||||
IWbemClassObject_Release( sig );
|
||||
return hr;
|
||||
hr = IWbemClassObject_SpawnInstance( sig, 0, &out_params );
|
||||
if (hr != S_OK)
|
||||
{
|
||||
VariantClear( &name );
|
||||
IWbemClassObject_Release( sig );
|
||||
return hr;
|
||||
}
|
||||
}
|
||||
hr = control_service( V_BSTR(&name), SERVICE_CONTROL_PAUSE, &retval );
|
||||
if (hr != S_OK) goto done;
|
||||
hr = IWbemClassObject_Put( *out, param_returnvalueW, 0, &retval, CIM_UINT32 );
|
||||
|
||||
if (out_params)
|
||||
hr = IWbemClassObject_Put( out_params, param_returnvalueW, 0, &retval, CIM_UINT32 );
|
||||
|
||||
done:
|
||||
VariantClear( &name );
|
||||
IWbemClassObject_Release( sig );
|
||||
if (hr != S_OK) IWbemClassObject_Release( *out );
|
||||
if (hr == S_OK && out)
|
||||
{
|
||||
*out = out_params;
|
||||
IWbemClassObject_AddRef( out_params );
|
||||
}
|
||||
if (out_params) IWbemClassObject_Release( out_params );
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT service_resume_service( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out )
|
||||
{
|
||||
VARIANT name, retval;
|
||||
IWbemClassObject *sig;
|
||||
IWbemClassObject *sig, *out_params = NULL;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("%p, %p, %p\n", obj, in, out);
|
||||
|
@ -116,21 +126,31 @@ HRESULT service_resume_service( IWbemClassObject *obj, IWbemClassObject *in, IWb
|
|||
VariantClear( &name );
|
||||
return hr;
|
||||
}
|
||||
hr = IWbemClassObject_SpawnInstance( sig, 0, out );
|
||||
if (hr != S_OK)
|
||||
if (out)
|
||||
{
|
||||
VariantClear( &name );
|
||||
IWbemClassObject_Release( sig );
|
||||
return hr;
|
||||
hr = IWbemClassObject_SpawnInstance( sig, 0, &out_params );
|
||||
if (hr != S_OK)
|
||||
{
|
||||
VariantClear( &name );
|
||||
IWbemClassObject_Release( sig );
|
||||
return hr;
|
||||
}
|
||||
}
|
||||
hr = control_service( V_BSTR(&name), SERVICE_CONTROL_CONTINUE, &retval );
|
||||
if (hr != S_OK) goto done;
|
||||
hr = IWbemClassObject_Put( *out, param_returnvalueW, 0, &retval, CIM_UINT32 );
|
||||
|
||||
if (out_params)
|
||||
hr = IWbemClassObject_Put( out_params, param_returnvalueW, 0, &retval, CIM_UINT32 );
|
||||
|
||||
done:
|
||||
VariantClear( &name );
|
||||
IWbemClassObject_Release( sig );
|
||||
if (hr != S_OK) IWbemClassObject_Release( *out );
|
||||
if (hr == S_OK && out)
|
||||
{
|
||||
*out = out_params;
|
||||
IWbemClassObject_AddRef( out_params );
|
||||
}
|
||||
if (out_params) IWbemClassObject_Release( out_params );
|
||||
return hr;
|
||||
}
|
||||
|
||||
|
@ -161,7 +181,7 @@ done:
|
|||
HRESULT service_start_service( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out )
|
||||
{
|
||||
VARIANT name, retval;
|
||||
IWbemClassObject *sig;
|
||||
IWbemClassObject *sig, *out_params = NULL;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("%p, %p, %p\n", obj, in, out);
|
||||
|
@ -175,28 +195,38 @@ HRESULT service_start_service( IWbemClassObject *obj, IWbemClassObject *in, IWbe
|
|||
VariantClear( &name );
|
||||
return hr;
|
||||
}
|
||||
hr = IWbemClassObject_SpawnInstance( sig, 0, out );
|
||||
if (hr != S_OK)
|
||||
if (out)
|
||||
{
|
||||
VariantClear( &name );
|
||||
IWbemClassObject_Release( sig );
|
||||
return hr;
|
||||
hr = IWbemClassObject_SpawnInstance( sig, 0, &out_params );
|
||||
if (hr != S_OK)
|
||||
{
|
||||
VariantClear( &name );
|
||||
IWbemClassObject_Release( sig );
|
||||
return hr;
|
||||
}
|
||||
}
|
||||
hr = start_service( V_BSTR(&name), &retval );
|
||||
if (hr != S_OK) goto done;
|
||||
hr = IWbemClassObject_Put( *out, param_returnvalueW, 0, &retval, CIM_UINT32 );
|
||||
|
||||
if (out_params)
|
||||
hr = IWbemClassObject_Put( out_params, param_returnvalueW, 0, &retval, CIM_UINT32 );
|
||||
|
||||
done:
|
||||
VariantClear( &name );
|
||||
IWbemClassObject_Release( sig );
|
||||
if (hr != S_OK) IWbemClassObject_Release( *out );
|
||||
if (hr == S_OK && out)
|
||||
{
|
||||
*out = out_params;
|
||||
IWbemClassObject_AddRef( out_params );
|
||||
}
|
||||
if (out_params) IWbemClassObject_Release( out_params );
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT service_stop_service( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out )
|
||||
{
|
||||
VARIANT name, retval;
|
||||
IWbemClassObject *sig;
|
||||
IWbemClassObject *sig, *out_params = NULL;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("%p, %p, %p\n", obj, in, out);
|
||||
|
@ -210,20 +240,30 @@ HRESULT service_stop_service( IWbemClassObject *obj, IWbemClassObject *in, IWbem
|
|||
VariantClear( &name );
|
||||
return hr;
|
||||
}
|
||||
hr = IWbemClassObject_SpawnInstance( sig, 0, out );
|
||||
if (hr != S_OK)
|
||||
if (out)
|
||||
{
|
||||
VariantClear( &name );
|
||||
IWbemClassObject_Release( sig );
|
||||
return hr;
|
||||
hr = IWbemClassObject_SpawnInstance( sig, 0, &out_params );
|
||||
if (hr != S_OK)
|
||||
{
|
||||
VariantClear( &name );
|
||||
IWbemClassObject_Release( sig );
|
||||
return hr;
|
||||
}
|
||||
}
|
||||
hr = control_service( V_BSTR(&name), SERVICE_CONTROL_STOP, &retval );
|
||||
if (hr != S_OK) goto done;
|
||||
hr = IWbemClassObject_Put( *out, param_returnvalueW, 0, &retval, CIM_UINT32 );
|
||||
|
||||
if (out_params)
|
||||
hr = IWbemClassObject_Put( out_params, param_returnvalueW, 0, &retval, CIM_UINT32 );
|
||||
|
||||
done:
|
||||
VariantClear( &name );
|
||||
IWbemClassObject_Release( sig );
|
||||
if (hr != S_OK) IWbemClassObject_Release( *out );
|
||||
if (hr == S_OK && out)
|
||||
{
|
||||
*out = out_params;
|
||||
IWbemClassObject_AddRef( out_params );
|
||||
}
|
||||
if (out_params) IWbemClassObject_Release( out_params );
|
||||
return hr;
|
||||
}
|
||||
|
|
|
@ -42,6 +42,9 @@ UINT get_type_size( CIMTYPE type )
|
|||
{
|
||||
case CIM_BOOLEAN:
|
||||
return sizeof(int);
|
||||
case CIM_SINT8:
|
||||
case CIM_UINT8:
|
||||
return sizeof(INT8);
|
||||
case CIM_SINT16:
|
||||
case CIM_UINT16:
|
||||
return sizeof(INT16);
|
||||
|
@ -101,6 +104,12 @@ HRESULT get_value( const struct table *table, UINT row, UINT column, LONGLONG *v
|
|||
case CIM_STRING:
|
||||
*val = (INT_PTR)*(const WCHAR **)ptr;
|
||||
break;
|
||||
case CIM_SINT8:
|
||||
*val = *(const INT8 *)ptr;
|
||||
break;
|
||||
case CIM_UINT8:
|
||||
*val = *(const UINT8 *)ptr;
|
||||
break;
|
||||
case CIM_SINT16:
|
||||
*val = *(const INT16 *)ptr;
|
||||
break;
|
||||
|
@ -205,6 +214,12 @@ HRESULT set_value( const struct table *table, UINT row, UINT column, LONGLONG va
|
|||
case CIM_STRING:
|
||||
*(WCHAR **)ptr = (WCHAR *)(INT_PTR)val;
|
||||
break;
|
||||
case CIM_SINT8:
|
||||
*(INT8 *)ptr = val;
|
||||
break;
|
||||
case CIM_UINT8:
|
||||
*(UINT8 *)ptr = val;
|
||||
break;
|
||||
case CIM_SINT16:
|
||||
*(INT16 *)ptr = val;
|
||||
break;
|
||||
|
@ -396,28 +411,3 @@ BSTR get_method_name( const WCHAR *class, UINT index )
|
|||
release_table( table );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
BSTR get_property_name( const WCHAR *class, UINT index )
|
||||
{
|
||||
struct table *table;
|
||||
UINT i, count = 0;
|
||||
BSTR ret;
|
||||
|
||||
if (!(table = grab_table( class ))) return NULL;
|
||||
|
||||
for (i = 0; i < table->num_cols; i++)
|
||||
{
|
||||
if (!(table->columns[i].type & COL_FLAG_METHOD))
|
||||
{
|
||||
if (index == count)
|
||||
{
|
||||
ret = SysAllocString( table->columns[i].name );
|
||||
release_table( table );
|
||||
return ret;
|
||||
}
|
||||
count++;
|
||||
}
|
||||
}
|
||||
release_table( table );
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -217,6 +217,7 @@ HRESULT get_column_index( const struct table *, const WCHAR *, UINT * ) DECLSPEC
|
|||
HRESULT get_value( const struct table *, UINT, UINT, LONGLONG * ) DECLSPEC_HIDDEN;
|
||||
BSTR get_value_bstr( const struct table *, UINT, UINT ) DECLSPEC_HIDDEN;
|
||||
HRESULT set_value( const struct table *, UINT, UINT, LONGLONG, CIMTYPE ) DECLSPEC_HIDDEN;
|
||||
BOOL is_method( const struct table *, UINT ) DECLSPEC_HIDDEN;
|
||||
HRESULT get_method( const struct table *, const WCHAR *, class_method ** ) DECLSPEC_HIDDEN;
|
||||
HRESULT get_propval( const struct view *, UINT, const WCHAR *, VARIANT *,
|
||||
CIMTYPE *, LONG * ) DECLSPEC_HIDDEN;
|
||||
|
@ -225,10 +226,10 @@ HRESULT to_longlong( VARIANT *, LONGLONG *, CIMTYPE * ) DECLSPEC_HIDDEN;
|
|||
SAFEARRAY *to_safearray( const struct array *, CIMTYPE ) DECLSPEC_HIDDEN;
|
||||
VARTYPE to_vartype( CIMTYPE ) DECLSPEC_HIDDEN;
|
||||
void destroy_array( struct array *, CIMTYPE ) DECLSPEC_HIDDEN;
|
||||
BOOL is_selected_prop( const struct view *, const WCHAR * ) DECLSPEC_HIDDEN;
|
||||
HRESULT get_properties( const struct view *, LONG, SAFEARRAY ** ) DECLSPEC_HIDDEN;
|
||||
HRESULT get_object( const WCHAR *, IWbemClassObject ** ) DECLSPEC_HIDDEN;
|
||||
BSTR get_method_name( const WCHAR *, UINT ) DECLSPEC_HIDDEN;
|
||||
BSTR get_property_name( const WCHAR *, UINT ) DECLSPEC_HIDDEN;
|
||||
void set_variant( VARTYPE, LONGLONG, void *, VARIANT * ) DECLSPEC_HIDDEN;
|
||||
HRESULT create_signature( const WCHAR *, const WCHAR *, enum param_direction,
|
||||
IWbemClassObject ** ) DECLSPEC_HIDDEN;
|
||||
|
@ -248,6 +249,8 @@ HRESULT service_pause_service(IWbemClassObject *, IWbemClassObject *, IWbemClass
|
|||
HRESULT service_resume_service(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN;
|
||||
HRESULT service_start_service(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN;
|
||||
HRESULT service_stop_service(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN;
|
||||
HRESULT security_get_sd(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN;
|
||||
HRESULT security_set_sd(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN;
|
||||
|
||||
static void *heap_alloc( size_t len ) __WINE_ALLOC_SIZE(1);
|
||||
static inline void *heap_alloc( size_t len )
|
||||
|
@ -283,15 +286,18 @@ static inline WCHAR *heap_strdupW( const WCHAR *src )
|
|||
static const WCHAR class_processW[] = {'W','i','n','3','2','_','P','r','o','c','e','s','s',0};
|
||||
static const WCHAR class_serviceW[] = {'W','i','n','3','2','_','S','e','r','v','i','c','e',0};
|
||||
static const WCHAR class_stdregprovW[] = {'S','t','d','R','e','g','P','r','o','v',0};
|
||||
static const WCHAR class_systemsecurityW[] = {'_','_','S','y','s','t','e','m','S','e','c','u','r','i','t','y',0};
|
||||
|
||||
static const WCHAR prop_nameW[] = {'N','a','m','e',0};
|
||||
|
||||
static const WCHAR method_enumkeyW[] = {'E','n','u','m','K','e','y',0};
|
||||
static const WCHAR method_enumvaluesW[] = {'E','n','u','m','V','a','l','u','e','s',0};
|
||||
static const WCHAR method_getownerW[] = {'G','e','t','O','w','n','e','r',0};
|
||||
static const WCHAR method_getsdW[] = {'G','e','t','S','D',0};
|
||||
static const WCHAR method_getstringvalueW[] = {'G','e','t','S','t','r','i','n','g','V','a','l','u','e',0};
|
||||
static const WCHAR method_pauseserviceW[] = {'P','a','u','s','e','S','e','r','v','i','c','e',0};
|
||||
static const WCHAR method_resumeserviceW[] = {'R','e','s','u','m','e','S','e','r','v','i','c','e',0};
|
||||
static const WCHAR method_setsdW[] = {'S','e','t','S','D',0};
|
||||
static const WCHAR method_startserviceW[] = {'S','t','a','r','t','S','e','r','v','i','c','e',0};
|
||||
static const WCHAR method_stopserviceW[] = {'S','t','o','p','S','e','r','v','i','c','e',0};
|
||||
|
||||
|
@ -299,6 +305,7 @@ static const WCHAR param_defkeyW[] = {'h','D','e','f','K','e','y',0};
|
|||
static const WCHAR param_domainW[] = {'D','o','m','a','i','n',0};
|
||||
static const WCHAR param_namesW[] = {'s','N','a','m','e','s',0};
|
||||
static const WCHAR param_returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
|
||||
static const WCHAR param_sdW[] = {'S','D',0};
|
||||
static const WCHAR param_subkeynameW[] = {'s','S','u','b','K','e','y','N','a','m','e',0};
|
||||
static const WCHAR param_typesW[] = {'T','y','p','e','s',0};
|
||||
static const WCHAR param_userW[] = {'U','s','e','r',0};
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -206,7 +206,7 @@ reactos/dll/win32/uxtheme # Forked
|
|||
reactos/dll/win32/vbscript # Synced to Wine-1.7.27
|
||||
reactos/dll/win32/version # Synced to Wine-1.7.17
|
||||
reactos/dll/win32/wbemdisp # Synced to Wine-1.7.17
|
||||
reactos/dll/win32/wbemprox # Synced to Wine-1.7.17
|
||||
reactos/dll/win32/wbemprox # Synced to Wine-1.7.27
|
||||
reactos/dll/win32/wer # Autosync
|
||||
reactos/dll/win32/windowscodecs # Synced to Wine-1.7.17
|
||||
reactos/dll/win32/windowscodecsext # Synced to Wine-1.7.17
|
||||
|
|
Loading…
Reference in a new issue