3333#include "perl.h"
3434#include "XSUB.h"
3535
36+ #include "../ppport.h"
37+
3638#define RETURNRESULT (x ) if ((x)){ XST_mYES(0); }\
3739 else { XST_mNO(0); }\
3840 XSRETURN(1)
@@ -575,6 +577,7 @@ WCTMB(LPWSTR lpwStr, LPSTR lpStr, int size)
575577 return WideCharToMultiByte (CP_ACP ,NULL ,lpwStr ,-1 ,lpStr ,size ,NULL ,NULL );
576578}
577579
580+ /*
578581void AddStringToHV(HV *hv, char *key, char *value)
579582{
580583 char buffer[256];
@@ -598,27 +601,57 @@ void AddDwordToHV(HV *hv, char *key, DWORD value )
598601 hv_store(hv, key, strlen(key), newSVnv((double)value), 0);
599602 return;
600603}
604+ */
605+
606+ DWORD GetAccountSIDA (LPCSTR lpSystemName , LPCSTR lpAccountName , PSID * pSid )
607+ {
608+ DWORD sidSize ;
609+ char refDomain [256 ];
610+ DWORD refDomainSize ;
611+ DWORD returnValue ;
612+ SID_NAME_USE snu ;
613+
614+ sidSize = 0 ;
615+ refDomainSize = 255 ;
616+ LookupAccountNameA (lpSystemName , lpAccountName , * pSid ,
617+ & sidSize , refDomain ,
618+ & refDomainSize , & snu );
619+ returnValue = GetLastError ();
620+ if (ERROR_INSUFFICIENT_BUFFER != returnValue )
621+ return returnValue ;
622+
623+ * pSid = (PSID )malloc (sidSize );
624+ refDomainSize = 255 ;
625+ if (!LookupAccountNameA (lpSystemName , lpAccountName , * pSid , & sidSize ,
626+ refDomain , & refDomainSize , & snu ))
627+ {
628+ free (* pSid );
629+ return GetLastError ();
630+ }
631+
632+ return ERROR_SUCCESS ;
633+ }
601634
602- DWORD GetAccountSID ( LPCTSTR lpSystemName , LPCTSTR lpAccountName , PSID * pSid )
635+ DWORD GetAccountSIDW ( LPCWSTR lpSystemName , LPCWSTR lpAccountName , PSID * pSid )
603636{
604637 DWORD sidSize ;
605- TCHAR refDomain [256 ];
638+ WCHAR refDomain [256 ];
606639 DWORD refDomainSize ;
607640 DWORD returnValue ;
608641 SID_NAME_USE snu ;
609642
610643 sidSize = 0 ;
611644 refDomainSize = 255 ;
612- LookupAccountName (lpSystemName , lpAccountName , * pSid ,
645+ LookupAccountNameW (lpSystemName , lpAccountName , * pSid ,
613646 & sidSize , refDomain ,
614- & refDomainSize , & snu );
647+ & refDomainSize , & snu );
615648 returnValue = GetLastError ();
616- if (ERROR_INSUFFICIENT_BUFFER != returnValue )
649+ if (ERROR_INSUFFICIENT_BUFFER != returnValue )
617650 return returnValue ;
618651
619652 * pSid = (PSID )malloc (sidSize );
620653 refDomainSize = 255 ;
621- if (!LookupAccountName (lpSystemName , lpAccountName , * pSid , & sidSize ,
654+ if (!LookupAccountNameW (lpSystemName , lpAccountName , * pSid , & sidSize ,
622655 refDomain , & refDomainSize , & snu ))
623656 {
624657 free (* pSid );
@@ -654,7 +687,7 @@ XS(XS_NT__NetAdmin_GetDomainController)
654687 AllocWideName ((char * )SvPV (ST (1 ),n_a ), lpwDomain );
655688 lastError = NetGetDCName (lpwServer , lpwDomain , (LPBYTE * )& lpwPrimaryDC );
656689 if (lastError == 0 ) {
657- WCTMB (lpwPrimaryDC , buffer , sizeof (buffer ));
690+ W2AHELPER (lpwPrimaryDC , buffer , sizeof (buffer ));
658691 SETPV (2 , buffer );
659692 NetApiBufferFree (lpwPrimaryDC );
660693 }
@@ -679,7 +712,7 @@ XS(XS_NT__NetAdmin_GetAnyDomainController)
679712 AllocWideName ((char * )SvPV (ST (1 ),n_a ), lpwDomain );
680713 lastError = NetGetAnyDCName (lpwServer , lpwDomain , (LPBYTE * )& lpwAnyDC );
681714 if (lastError == 0 ) {
682- WCTMB (lpwAnyDC , buffer , sizeof (buffer ));
715+ W2AHELPER (lpwAnyDC , buffer , sizeof (buffer ));
683716 SETPV (2 , buffer );
684717 NetApiBufferFree (lpwAnyDC );
685718 }
@@ -775,16 +808,16 @@ XS(XS_NT__NetAdmin_UserGetAttributes)
775808 AllocWideName ((char * )SvPV (ST (1 ),n_a ), lpwUser );
776809 lastError = NetUserGetInfo (lpwServer , lpwUser , 1 , (LPBYTE * )& puiUser );
777810 if (lastError == 0 ) {
778- WCTMB (puiUser -> usri1_password , buffer , sizeof (buffer ));
811+ W2AHELPER (puiUser -> usri1_password , buffer , sizeof (buffer ));
779812 SETPV (2 , buffer );
780813 SETIV (3 , puiUser -> usri1_password_age );
781814 SETIV (4 , puiUser -> usri1_priv );
782- WCTMB (puiUser -> usri1_home_dir , buffer , sizeof (buffer ));
815+ W2AHELPER (puiUser -> usri1_home_dir , buffer , sizeof (buffer ));
783816 SETPV (5 , buffer );
784- WCTMB (puiUser -> usri1_comment , buffer , sizeof (buffer ));
817+ W2AHELPER (puiUser -> usri1_comment , buffer , sizeof (buffer ));
785818 SETPV (6 , buffer );
786819 SETIV (7 , puiUser -> usri1_flags );
787- WCTMB (puiUser -> usri1_script_path , buffer , sizeof (buffer ));
820+ W2AHELPER (puiUser -> usri1_script_path , buffer , sizeof (buffer ));
788821 SETPV (8 , buffer );
789822 NetApiBufferFree (puiUser );
790823 }
@@ -914,7 +947,7 @@ XS(XS_NT__NetAdmin_GetUsers)
914947 if (lastError != 0 && lastError != ERROR_MORE_DATA )
915948 break ;
916949 for (index = 0 ; index < entriesRead ; ++ index ) {
917- WCTMB (pwzUsers [index ].usri0_name , buffer , sizeof (buffer ));
950+ W2AHELPER (pwzUsers [index ].usri0_name , buffer , sizeof (buffer ));
918951 av_push ((AV * )sv , newSVpv (buffer , 0 ));
919952 }
920953 NetApiBufferFree (pwzUsers );
@@ -932,8 +965,8 @@ XS(XS_NT__NetAdmin_GetUsers)
932965 if (lastError != 0 && lastError != ERROR_MORE_DATA )
933966 break ;
934967 for (index = 0 ; index < entriesRead ; ++ index ) {
935- WCTMB (pwzUsers10 [index ].usri10_name , buffer , sizeof (buffer ));
936- WCTMB (pwzUsers10 [index ].usri10_full_name , buffer1 ,
968+ W2AHELPER (pwzUsers10 [index ].usri10_name , buffer , sizeof (buffer ));
969+ W2AHELPER (pwzUsers10 [index ].usri10_full_name , buffer1 ,
937970 sizeof (buffer1 ));
938971 hv_store ((HV * )sv , buffer , strlen (buffer ),
939972 newSVpv (buffer1 ,0 ), 0 );
@@ -982,7 +1015,7 @@ XS(XS_NT__NetAdmin_GetTransports)
9821015 if (lastError != 0 && lastError != ERROR_MORE_DATA )
9831016 break ;
9841017 for (index = 0 ; index < entriesRead ; ++ index ) {
985- WCTMB (pws [index ].wkti0_transport_name , buffer ,
1018+ W2AHELPER (pws [index ].wkti0_transport_name , buffer ,
9861019 sizeof (buffer ));
9871020 av_push ((AV * )sv , newSVpv (buffer , 0 ));
9881021 }
@@ -1010,12 +1043,12 @@ XS(XS_NT__NetAdmin_GetTransports)
10101043 "number_of_vcs" ,
10111044 strlen ("number_of_vcs" ),
10121045 newSViv ((long )pws [index ].wkti0_number_of_vcs ), 0 );
1013- WCTMB (pws [index ].wkti0_transport_name , buffer , sizeof (buffer ));
1046+ W2AHELPER (pws [index ].wkti0_transport_name , buffer , sizeof (buffer ));
10141047 hv_store (hvTemp ,
10151048 "transport_name" ,
10161049 strlen ("transport_name" ),
10171050 newSVpv ((char * ) buffer , strlen ((char * )buffer )), 0 );
1018- WCTMB (pws [index ].wkti0_transport_address ,buffer1 ,sizeof (buffer1 ));
1051+ W2AHELPER (pws [index ].wkti0_transport_address ,buffer1 ,sizeof (buffer1 ));
10191052 hv_store (hvTemp ,
10201053 "transport_address" ,
10211054 strlen ("transport_address" ),
@@ -1073,7 +1106,7 @@ XS(XS_NT__NetAdmin_LoggedOnUsers)
10731106 if (lastError != 0 && lastError != ERROR_MORE_DATA )
10741107 break ;
10751108 for (index = 0 ; index < entriesRead ; ++ index ) {
1076- WCTMB (pwzUser0 [index ].wkui0_username , buffer , sizeof (buffer ));
1109+ W2AHELPER (pwzUser0 [index ].wkui0_username , buffer , sizeof (buffer ));
10771110 av_push ((AV * )sv , newSVpv (buffer , 0 ));
10781111 }
10791112 NetApiBufferFree (pwzUser0 );
@@ -1091,10 +1124,10 @@ XS(XS_NT__NetAdmin_LoggedOnUsers)
10911124 if (lastError != 0 && lastError != ERROR_MORE_DATA )
10921125 break ;
10931126 for (index = 0 ; index < entriesRead ; ++ index ) {
1094- WCTMB (pwzUser1 [index ].wkui1_username , buffer , sizeof (buffer ));
1095- WCTMB (pwzUser1 [index ].wkui1_logon_domain , logon_domain ,
1127+ W2AHELPER (pwzUser1 [index ].wkui1_username , buffer , sizeof (buffer ));
1128+ W2AHELPER (pwzUser1 [index ].wkui1_logon_domain , logon_domain ,
10961129 sizeof (logon_domain ));
1097- WCTMB (pwzUser1 [index ].wkui1_logon_server , logon_server ,
1130+ W2AHELPER (pwzUser1 [index ].wkui1_logon_server , logon_server ,
10981131 sizeof (logon_server ));
10991132 sprintf (buffer1 ,"%s;%s;%s" , buffer , logon_domain ,
11001133 logon_server );
@@ -1172,7 +1205,7 @@ XS(XS_NT__NetAdmin_GroupGetAttributes)
11721205 lastError = NetGroupGetInfo (lpwServer , lpwGroup , 2 ,
11731206 (LPBYTE * )& pgroupInfo );
11741207 if (lastError == 0 ) {
1175- WCTMB (pgroupInfo -> grpi2_comment , buffer , sizeof (buffer ));
1208+ W2AHELPER (pgroupInfo -> grpi2_comment , buffer , sizeof (buffer ));
11761209 SETPV (2 , buffer );
11771210 NetApiBufferFree (pgroupInfo );
11781211 }
@@ -1386,7 +1419,7 @@ XS(XS_NT__NetAdmin_GroupGetMembers)
13861419 if (lastError != 0 && lastError != ERROR_MORE_DATA )
13871420 break ;
13881421 for (index = 0 ; index < entriesRead ; ++ index ) {
1389- WCTMB (pwzGroupUsers [index ].grui0_name ,
1422+ W2AHELPER (pwzGroupUsers [index ].grui0_name ,
13901423 buffer , sizeof (buffer ));
13911424 av_push ((AV * )sv , newSVpv (buffer , 0 ));
13921425 }
@@ -1460,7 +1493,7 @@ XS(XS_NT__NetAdmin_LocalGroupGetAttributes)
14601493 AllocWideName ((char * )SvPV (ST (1 ),n_a ), lpwGroup );
14611494 lastError = NetLocalGroupGetInfo (lpwServer , lpwGroup , 1 , (LPBYTE * )& pgroupInfo );
14621495 if (lastError == 0 ) {
1463- WCTMB (pgroupInfo -> lgrpi1_comment , buffer , sizeof (buffer ));
1496+ W2AHELPER (pgroupInfo -> lgrpi1_comment , buffer , sizeof (buffer ));
14641497 SETPV (2 , buffer );
14651498 NetApiBufferFree (pgroupInfo );
14661499 }
@@ -1605,9 +1638,19 @@ XS(XS_NT__NetAdmin_LocalGroupIsMember)
16051638 STRLEN n_a ;
16061639#if 1
16071640 PSID pSid ;
1608- lastError = GetAccountSID ((LPCTSTR )SvPV (ST (0 ),n_a ),
1609- (LPCTSTR )SvPV (ST (2 ),n_a ),
1610- & pSid );
1641+ if (USING_WIDE ()) {
1642+ WCHAR wSystemName [MAX_PATH + 1 ];
1643+ WCHAR wAccountName [MAX_PATH + 1 ];
1644+ A2WHELPER ((LPCTSTR )SvPV (ST (0 ),n_a ), wSystemName , sizeof (wSystemName ));
1645+ A2WHELPER ((LPCTSTR )SvPV (ST (2 ),n_a ), wAccountName , sizeof (wAccountName ));
1646+ lastError = GetAccountSIDW (wSystemName ,
1647+ wAccountName ,
1648+ & pSid );
1649+ }
1650+ else
1651+ lastError = GetAccountSIDA ((LPCTSTR )SvPV (ST (0 ),n_a ),
1652+ (LPCTSTR )SvPV (ST (2 ),n_a ),
1653+ & pSid );
16111654 if (ERROR_SUCCESS != lastError )
16121655 XSRETURN_NO ;
16131656
@@ -1630,6 +1673,8 @@ XS(XS_NT__NetAdmin_LocalGroupIsMember)
16301673 NetApiBufferFree (pwzMembersInfo );
16311674 } while (bReturn == FALSE &&
16321675 (lastError == ERROR_MORE_DATA || resumeHandle != 0 ));
1676+
1677+ free (pSid );
16331678 FreeWideName (lpwServer );
16341679 FreeWideName (lpwGroup );
16351680#else
@@ -1695,7 +1740,7 @@ XS(XS_NT__NetAdmin_LocalGroupGetMembers)
16951740 if (lastError != 0 && lastError != ERROR_MORE_DATA )
16961741 break ;
16971742 for (index = 0 ; index < entriesRead ; ++ index ) {
1698- WCTMB (pwzMembersInfo [index ].lgrmi1_name , buffer ,
1743+ W2AHELPER (pwzMembersInfo [index ].lgrmi1_name , buffer ,
16991744 sizeof (buffer ));
17001745 av_push ((AV * )sv , newSVpv (buffer , 0 ));
17011746 }
@@ -1746,7 +1791,7 @@ XS(XS_NT__NetAdmin_LocalGroupGetMembersWithDomain)
17461791 if (lastError != 0 && lastError != ERROR_MORE_DATA )
17471792 break ;
17481793 for (index = 0 ; index < entriesRead ; ++ index ) {
1749- WCTMB (pwzMembersInfo [index ].lgrmi2_domainandname , buffer ,
1794+ W2AHELPER (pwzMembersInfo [index ].lgrmi2_domainandname , buffer ,
17501795 sizeof (buffer ));
17511796 av_push ((AV * )sv , newSVpv (buffer , 0 ));
17521797 }
@@ -1768,7 +1813,7 @@ XS(XS_NT__NetAdmin_LocalGroupGetMembersWithDomain)
17681813 if (lastError != 0 && lastError != ERROR_MORE_DATA )
17691814 break ;
17701815 for (index = 0 ; index < entriesRead ; ++ index ) {
1771- WCTMB (pwzMembersInfo [index ].lgrmi2_domainandname , buffer ,
1816+ W2AHELPER (pwzMembersInfo [index ].lgrmi2_domainandname , buffer ,
17721817 sizeof (buffer ));
17731818 sprintf (buffer1 , "%d" , pwzMembersInfo [index ].lgrmi2_sidusage );
17741819 hv_store ((HV * )sv , buffer , strlen (buffer ),
@@ -1822,7 +1867,7 @@ XS(XS_NT__NetAdmin_GetServers)
18221867 if (lastError != 0 && lastError != ERROR_MORE_DATA )
18231868 break ;
18241869 for (index = 0 ; index < entriesRead ; ++ index ) {
1825- WCTMB (pwzServerInfo [index ].sv100_name , buffer ,
1870+ W2AHELPER (pwzServerInfo [index ].sv100_name , buffer ,
18261871 sizeof (buffer ));
18271872 av_push ((AV * )sv , newSVpv (buffer , 0 ));
18281873 }
@@ -1844,9 +1889,9 @@ XS(XS_NT__NetAdmin_GetServers)
18441889 if (lastError != 0 && lastError != ERROR_MORE_DATA )
18451890 break ;
18461891 for (index = 0 ; index < entriesRead ; ++ index ) {
1847- WCTMB (pwzServerInfo101 [index ].sv101_name , buffer ,
1892+ W2AHELPER (pwzServerInfo101 [index ].sv101_name , buffer ,
18481893 sizeof (buffer ));
1849- WCTMB (pwzServerInfo101 [index ].sv101_comment , buffer1 ,
1894+ W2AHELPER (pwzServerInfo101 [index ].sv101_comment , buffer1 ,
18501895 sizeof (buffer1 ));
18511896 hv_store ((HV * )sv , buffer , strlen (buffer ),
18521897 newSVpv (buffer1 ,0 ), 0 );
@@ -1897,7 +1942,7 @@ XS(XS_NT__NetAdmin_GetServerDisks)
18971942 break ;
18981943 p = disks ;
18991944 for (index = 0 ; index < entriesRead ; ++ index ) {
1900- WCTMB (p , buffer , sizeof (buffer ));
1945+ W2AHELPER (p , buffer , sizeof (buffer ));
19011946 av_push ((AV * )sv , newSVpv (buffer , strlen (buffer )));
19021947 p += 3 ;
19031948 }
@@ -1947,7 +1992,7 @@ XS(XS_NT__NetAdmin_GetAliasFromRID)
19471992 }
19481993 if (bSuccess )
19491994 {
1950- WCTMB (Name , buffer , sizeof (buffer ));
1995+ W2AHELPER (Name , buffer , sizeof (buffer ));
19511996 SETPV (2 ,buffer );
19521997 }
19531998 FreeWideName (lpwServer );
@@ -2032,7 +2077,7 @@ XS(XS_NT__NetAdmin_GetUserGroupFromRID)
20322077 NetApiBufferFree (umi2 );
20332078 if (bSuccess )
20342079 {
2035- WCTMB (Name , buffer , sizeof (buffer ));
2080+ W2AHELPER (Name , buffer , sizeof (buffer ));
20362081 SETPV (2 ,buffer );
20372082 }
20382083 FreeWideName (lpwServer );
0 commit comments