vc++ install requires NetUserModalsGet

Saulius Krasuckas saulius2 at
Fri Aug 6 04:41:04 CDT 2004

On Sat, 31 Jul 2004, James Hawkins wrote:
> Looking into netapi32/access.c, NetUserModalsGet is a stub and returns
> NERR_InternalError by default.  I think vcsetup is requiring this call
> to succeed so it bails out because of the error.
> Reading the trace and the msdn docs about NetUserModalsGet, vcsetup is
> calling with the level parameter == 2 so it is requesting the domain
> name and identifier.
> With the included patch, I have stubbed the structure of the 4 levels
> that can be queried, but I haven't written the code to handle them
> yet.  If anyone has any information or links that will enlighten me
> about netapi32 or anything pertaining to this matter, I would greatly
> appreciate it.

I see [1] you've tried to implement the case of NetUserModalsGet()  
functionality where level == 2, also.  Thanks, I need it, too.  AFAIK it
would suffice only to copy information pointed by the
that, while you have done something very complex IMHO:

-NET_API_STATUS WINAPI NetUserModalsGet(LPCWSTR szServer, DWORD level, LPBYTE *pbuffer)
+NET_API_STATUS WINAPI NetUserModalsGet(LPCWSTR server, DWORD level, LPBYTE *bufptr)
+            ...
+            PPOLICY_ACCOUNT_DOMAIN_INFO domainInfo;
+            PSID domainIdentifier;
+            ...
+            domainNameLen = lstrlenW(domainInfo->DomainName.Buffer) + 1;
+            ...
+            NetApiBufferAllocate(domainNameLen * sizeof(WCHAR) + sizeof(PSID), (LPVOID *)bufptr);
+            umi = (USER_MODALS_INFO_2 *) *bufptr;
+            umi->usrmod2_domain_name = (LPWSTR) (*bufptr + sizeof(USER_MODALS_INFO_2));
+            umi->usrmod2_domain_id = (PSID) (
+                 ((PBYTE) umi->usrmod2_domain_name) + domainNameLen * sizeof(WCHAR));
+            lstrcpynW(umi->usrmod2_domain_name, domainInfo->DomainName.Buffer, domainNameLen);
+            CopySid(sizeof(umi->usrmod2_domain_id), 
+                    umi->usrmod2_domain_id, domainIdentifier);


1, there is big memory block allocated during the call to a
   NetApiBufferAllocate().  What for?  Why just not use a size of

   And yes, then you need to allocate the space twice more - for a string
   and for the new SID copy.  

2, maybe you want to allocate all needed space using a single buffer?
   Then what does this size mean:
   "domainNameLen * sizeof(WCHAR) + sizeof(PSID)" ?

3, the domainIdentifier variable is left uninitialized.

Does the patch work for you?  I know, instead of asking I should sit down
and just write some additional tests for the netapi32.dll.

What I cannot decide myself here (after having read the MSDN docs) is the
responsibility for freeing memory blocks, one allocated for the unicode
string (usrmod2_domain_name) and another one to hold the copy of SID

MSDN tells only to free the memory allocated for the buffer (pointed by
the *bufptr).  Every sample of C code on the net I've found which calls
NetUserModalsGet() (and where the buffer contains some pointers by itself:
USER_MODALS_INFO_1, USER_MODALS_INFO_2) isn't freeing those internal
pointers: [2], [3], [4].

Does this mean the code (caller) leaks memory or it's just some automagic
used on the system side (callee) to free the memory (on real Windows)  

> quote from MSDN:
> "The NetUserModalsGet function retrieves global information for all
> users and global groups in the security database, which is the
> security accounts manager (SAM) database or, in the case of domain
> controllers, the Active Directory."
> Does wine have a security accounts manager or an Active Directory?

Good q.  Will someone answer it, please?


More information about the wine-devel mailing list