calling NetShareEnum win32api with ctypes

castironpi castironpi at gmail.com
Thu Aug 28 02:01:04 EDT 2008


On Aug 28, 12:01 am, taghi <eghli... at gmail.com> wrote:
> I want to call NetShareEnum, a function from netapi32.dll
> NetShareEnum has this definition:
>
> NET_API_STATUS NetShareEnum(
>   __in     LPWSTR servername,
>   __in     DWORD level,
>   __out    LPBYTE *bufptr,
>   __in     DWORD prefmaxlen,
>   __out    LPDWORD entriesread,
>   __out    LPDWORD totalentries,
>   __inout  LPDWORD resume_handle
> );
>
> I wrote this code in python 2.5:
>
> from ctypes import *
>
> cname=c_wchar_p('a-computer-name')
> level=c_int(1)
> bufptr=create_string_buffer('\00', 10000)
> prefmaxlen=c_int(9999)
> entriesread=c_long(0)
> totalentries=c_long(0)
> resume=c_long(0)
>
> netapi32=cdll.LoadLibrary('netapi32.dll')
> netapi32.NetShareEnum(cname, level, byref(bufptr), prefmaxlen,
> byref(entriesread), byref(totalentries), byref(resume))
>
> but I get this error:
> Traceback (most recent call last):
>   File "<pyshell#12>", line 1, in <module>
>     s.NetShareEnum(name, level, byref(bufptr), prefmaxlen,
> entriesread, totalentries, resume)
> ValueError: Procedure called with not enough arguments (28 bytes
> missing) or wrong calling convention
>
> entriesread and totalentries has valid values after call but bufptr is
> not.
> I pass bufptr to function instead of byref(bufptr) but the error was
> same.

Taghi,

I just learned how to do this myself.  I tested this revision on WinXP
Python 2.5.

from ctypes import *
netapi32= cdll.LoadLibrary( 'netapi32.dll' )

cname=c_wchar_p('[mycompname]')
level=c_int(1)
#bufptr=create_string_buffer('\00', 10000)
bufptr=c_void_p(0)
prefmaxlen=c_int(9999)
entriesread=c_long(0)
totalentries=c_long(0)
resume=c_long(0)

prototype= WINFUNCTYPE( c_int,
    c_wchar_p,
    c_int,
    POINTER( c_void_p ),
    c_int,
    POINTER( c_long ),
    POINTER( c_long ),
    POINTER( c_long )
    )
NetShareEnum= prototype( ( "NetShareEnum", netapi32 ) )

result= NetShareEnum(cname,
    level,
    pointer(bufptr),
    prefmaxlen,
    byref(entriesread),
    byref(totalentries),
    byref(resume)
    )

print result
print cname, level, bufptr, prefmaxlen, entriesread, totalentries,
resume


The 'bufptr' parameter receives a pointer to a buffer on return, which
you then have to free using NetApiBufferFree.  Here is my output:

0
c_wchar_p(u'[mycompname]') c_long(1) c_void_p(2382504) c_long(9999)
c_long(2) c_l
ong(2) c_long(0)

'bufptr' now points to an array of SHARE_INFO_1 structures, which you
will have to define too.  It copied 2/2 entries, or 'entriesread' /
'totalentries'.  Return 0 indicates success.



More information about the Python-list mailing list