Hans Leidekker : wbemprox: Implement Win32_SID.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Feb 13 07:55:57 CST 2015
Module: wine
Branch: master
Commit: 91c7a84af5b52c2b507cb5559a97362a79c7fa61
URL: http://source.winehq.org/git/wine.git/?a=commit;h=91c7a84af5b52c2b507cb5559a97362a79c7fa61
Author: Hans Leidekker <hans at codeweavers.com>
Date: Fri Feb 13 13:40:36 2015 +0100
wbemprox: Implement Win32_SID.
---
dlls/wbemprox/builtin.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 116 insertions(+)
diff --git a/dlls/wbemprox/builtin.c b/dlls/wbemprox/builtin.c
index 6b65c35..79ce561 100644
--- a/dlls/wbemprox/builtin.c
+++ b/dlls/wbemprox/builtin.c
@@ -39,6 +39,8 @@
#include "winioctl.h"
#include "winsvc.h"
#include "winver.h"
+#include "sddl.h"
+#include "ntsecapi.h"
#include "wine/debug.h"
#include "wbemprox_private.h"
@@ -89,11 +91,15 @@ 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_sidW[] =
+ {'W','i','n','3','2','_','S','I','D',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[] =
{'W','i','n','3','2','_','V','i','d','e','o','C','o','n','t','r','o','l','l','e','r',0};
+static const WCHAR prop_accountnameW[] =
+ {'A','c','c','o','u','n','t','N','a','m','e',0};
static const WCHAR prop_acceptpauseW[] =
{'A','c','c','e','p','t','P','a','u','s','e',0};
static const WCHAR prop_acceptstopW[] =
@@ -110,6 +116,8 @@ static const WCHAR prop_addresswidthW[] =
{'A','d','d','r','e','s','s','W','i','d','t','h',0};
static const WCHAR prop_availabilityW[] =
{'A','v','a','i','l','a','b','i','l','i','t','y',0};
+static const WCHAR prop_binaryrepresentationW[] =
+ {'B','i','n','a','r','y','R','e','p','r','e','s','e','n','t','a','t','i','o','n',0};
static const WCHAR prop_bootableW[] =
{'B','o','o','t','a','b','l','e',0};
static const WCHAR prop_bootpartitionW[] =
@@ -248,6 +256,8 @@ static const WCHAR prop_productW[] =
{'P','r','o','d','u','c','t',0};
static const WCHAR prop_productnameW[] =
{'P','r','o','d','u','c','t','N','a','m','e',0};
+static const WCHAR prop_referenceddomainnameW[] =
+ {'R','e','f','e','r','e','n','c','e','d','D','o','m','a','i','n','N','a','m','e',0};
static const WCHAR prop_releasedateW[] =
{'R','e','l','e','a','s','e','D','a','t','e',0};
static const WCHAR prop_serialnumberW[] =
@@ -262,6 +272,10 @@ static const WCHAR prop_smbiosbiosversionW[] =
{'S','M','B','I','O','S','B','I','O','S','V','e','r','s','i','o','n',0};
static const WCHAR prop_startmodeW[] =
{'S','t','a','r','t','M','o','d','e',0};
+static const WCHAR prop_sidW[] =
+ {'S','I','D',0};
+static const WCHAR prop_sidlengthW[] =
+ {'S','i','d','L','e','n','g','t','h',0};
static const WCHAR prop_sizeW[] =
{'S','i','z','e',0};
static const WCHAR prop_speedW[] =
@@ -517,6 +531,14 @@ static const struct column col_service[] =
{ method_startserviceW, CIM_FLAG_ARRAY|COL_FLAG_METHOD },
{ method_stopserviceW, CIM_FLAG_ARRAY|COL_FLAG_METHOD }
};
+static const struct column col_sid[] =
+{
+ { prop_accountnameW, CIM_STRING|COL_FLAG_DYNAMIC },
+ { prop_binaryrepresentationW, CIM_UINT8|CIM_FLAG_ARRAY|COL_FLAG_DYNAMIC },
+ { prop_referenceddomainnameW, CIM_STRING|COL_FLAG_DYNAMIC },
+ { prop_sidW, CIM_STRING|COL_FLAG_DYNAMIC|COL_FLAG_KEY },
+ { prop_sidlengthW, CIM_UINT32 }
+};
static const struct column col_sounddevice[] =
{
{ prop_nameW, CIM_STRING },
@@ -855,6 +877,14 @@ struct record_service
class_method *start_service;
class_method *stop_service;
};
+struct record_sid
+{
+ const WCHAR *accountname;
+ const UINT8 *binaryrepresentation;
+ const WCHAR *referenceddomainname;
+ const WCHAR *sid;
+ UINT32 sidlength;
+};
struct record_sounddevice
{
const WCHAR *name;
@@ -2421,6 +2451,91 @@ done:
return fill_status;
}
+static WCHAR *get_accountname( LSA_TRANSLATED_NAME *name )
+{
+ if (!name || !name->Name.Buffer) return NULL;
+ return heap_strdupW( name->Name.Buffer );
+}
+static UINT8 *get_binaryrepresentation( PSID sid, UINT len )
+{
+ UINT8 *ret = heap_alloc( len );
+ if (!ret) return NULL;
+ memcpy( ret, sid, len );
+ return ret;
+}
+static WCHAR *get_referenceddomainname( LSA_REFERENCED_DOMAIN_LIST *domain )
+{
+ if (!domain || !domain->Domains || !domain->Domains->Name.Buffer) return NULL;
+ return heap_strdupW( domain->Domains->Name.Buffer );
+}
+static const WCHAR *find_sid_str( const struct expr *cond )
+{
+ const struct expr *left, *right;
+ const WCHAR *ret = NULL;
+
+ if (!cond || cond->type != EXPR_COMPLEX || cond->u.expr.op != OP_EQ) return NULL;
+
+ left = cond->u.expr.left;
+ right = cond->u.expr.right;
+ if (left->type == EXPR_PROPVAL && right->type == EXPR_SVAL && !strcmpiW( left->u.propval->name, prop_sidW ))
+ {
+ ret = right->u.sval;
+ }
+ else if (left->type == EXPR_SVAL && right->type == EXPR_PROPVAL && !strcmpiW( right->u.propval->name, prop_sidW ))
+ {
+ ret = left->u.sval;
+ }
+ return ret;
+}
+
+static enum fill_status fill_sid( struct table *table, const struct expr *cond )
+{
+ PSID sid;
+ LSA_REFERENCED_DOMAIN_LIST *domain;
+ LSA_TRANSLATED_NAME *name;
+ LSA_HANDLE handle;
+ LSA_OBJECT_ATTRIBUTES attrs;
+ const WCHAR *str;
+ struct record_sid *rec;
+ UINT len;
+
+ if (!(str = find_sid_str( cond ))) return FILL_STATUS_FAILED;
+ if (!resize_table( table, 1, sizeof(*rec) )) return FILL_STATUS_FAILED;
+
+ if (!ConvertStringSidToSidW( str, &sid )) return FILL_STATUS_FAILED;
+ len = GetLengthSid( sid );
+
+ memset( &attrs, 0, sizeof(attrs) );
+ attrs.Length = sizeof(attrs);
+ if (LsaOpenPolicy( NULL, &attrs, POLICY_ALL_ACCESS, &handle ))
+ {
+ LocalFree( sid );
+ return FILL_STATUS_FAILED;
+ }
+ if (LsaLookupSids( handle, 1, &sid, &domain, &name ))
+ {
+ LocalFree( sid );
+ LsaClose( handle );
+ return FILL_STATUS_FAILED;
+ }
+
+ rec = (struct record_sid *)table->data;
+ rec->accountname = get_accountname( name );
+ rec->binaryrepresentation = get_binaryrepresentation( sid, len );
+ rec->referenceddomainname = get_referenceddomainname( domain );
+ rec->sid = heap_strdupW( str );
+ rec->sidlength = len;
+
+ TRACE("created 1 row\n");
+ table->num_rows = 1;
+
+ LsaFreeMemory( domain );
+ LsaFreeMemory( name );
+ LocalFree( sid );
+ LsaClose( handle );
+ return FILL_STATUS_FILTERED;
+}
+
static UINT32 get_bits_per_pixel( UINT *hres, UINT *vres )
{
HDC hdc = GetDC( NULL );
@@ -2524,6 +2639,7 @@ static struct table builtin_classes[] =
{ 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_sidW, SIZEOF(col_sid), col_sid, 0, 0, NULL, fill_sid },
{ 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 },
More information about the wine-cvs
mailing list