33
33
#include "perl.h"
34
34
#include "XSUB.h"
35
35
36
+ #include "../ppport.h"
37
+
36
38
#define RETURNRESULT (x ) if ((x)){ XST_mYES(0); }\
37
39
else { XST_mNO(0); }\
38
40
XSRETURN(1)
@@ -575,6 +577,7 @@ WCTMB(LPWSTR lpwStr, LPSTR lpStr, int size)
575
577
return WideCharToMultiByte (CP_ACP ,NULL ,lpwStr ,-1 ,lpStr ,size ,NULL ,NULL );
576
578
}
577
579
580
+ /*
578
581
void AddStringToHV(HV *hv, char *key, char *value)
579
582
{
580
583
char buffer[256];
@@ -598,27 +601,57 @@ void AddDwordToHV(HV *hv, char *key, DWORD value )
598
601
hv_store(hv, key, strlen(key), newSVnv((double)value), 0);
599
602
return;
600
603
}
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
+ }
601
634
602
- DWORD GetAccountSID ( LPCTSTR lpSystemName , LPCTSTR lpAccountName , PSID * pSid )
635
+ DWORD GetAccountSIDW ( LPCWSTR lpSystemName , LPCWSTR lpAccountName , PSID * pSid )
603
636
{
604
637
DWORD sidSize ;
605
- TCHAR refDomain [256 ];
638
+ WCHAR refDomain [256 ];
606
639
DWORD refDomainSize ;
607
640
DWORD returnValue ;
608
641
SID_NAME_USE snu ;
609
642
610
643
sidSize = 0 ;
611
644
refDomainSize = 255 ;
612
- LookupAccountName (lpSystemName , lpAccountName , * pSid ,
645
+ LookupAccountNameW (lpSystemName , lpAccountName , * pSid ,
613
646
& sidSize , refDomain ,
614
- & refDomainSize , & snu );
647
+ & refDomainSize , & snu );
615
648
returnValue = GetLastError ();
616
- if (ERROR_INSUFFICIENT_BUFFER != returnValue )
649
+ if (ERROR_INSUFFICIENT_BUFFER != returnValue )
617
650
return returnValue ;
618
651
619
652
* pSid = (PSID )malloc (sidSize );
620
653
refDomainSize = 255 ;
621
- if (!LookupAccountName (lpSystemName , lpAccountName , * pSid , & sidSize ,
654
+ if (!LookupAccountNameW (lpSystemName , lpAccountName , * pSid , & sidSize ,
622
655
refDomain , & refDomainSize , & snu ))
623
656
{
624
657
free (* pSid );
@@ -654,7 +687,7 @@ XS(XS_NT__NetAdmin_GetDomainController)
654
687
AllocWideName ((char * )SvPV (ST (1 ),n_a ), lpwDomain );
655
688
lastError = NetGetDCName (lpwServer , lpwDomain , (LPBYTE * )& lpwPrimaryDC );
656
689
if (lastError == 0 ) {
657
- WCTMB (lpwPrimaryDC , buffer , sizeof (buffer ));
690
+ W2AHELPER (lpwPrimaryDC , buffer , sizeof (buffer ));
658
691
SETPV (2 , buffer );
659
692
NetApiBufferFree (lpwPrimaryDC );
660
693
}
@@ -679,7 +712,7 @@ XS(XS_NT__NetAdmin_GetAnyDomainController)
679
712
AllocWideName ((char * )SvPV (ST (1 ),n_a ), lpwDomain );
680
713
lastError = NetGetAnyDCName (lpwServer , lpwDomain , (LPBYTE * )& lpwAnyDC );
681
714
if (lastError == 0 ) {
682
- WCTMB (lpwAnyDC , buffer , sizeof (buffer ));
715
+ W2AHELPER (lpwAnyDC , buffer , sizeof (buffer ));
683
716
SETPV (2 , buffer );
684
717
NetApiBufferFree (lpwAnyDC );
685
718
}
@@ -775,16 +808,16 @@ XS(XS_NT__NetAdmin_UserGetAttributes)
775
808
AllocWideName ((char * )SvPV (ST (1 ),n_a ), lpwUser );
776
809
lastError = NetUserGetInfo (lpwServer , lpwUser , 1 , (LPBYTE * )& puiUser );
777
810
if (lastError == 0 ) {
778
- WCTMB (puiUser -> usri1_password , buffer , sizeof (buffer ));
811
+ W2AHELPER (puiUser -> usri1_password , buffer , sizeof (buffer ));
779
812
SETPV (2 , buffer );
780
813
SETIV (3 , puiUser -> usri1_password_age );
781
814
SETIV (4 , puiUser -> usri1_priv );
782
- WCTMB (puiUser -> usri1_home_dir , buffer , sizeof (buffer ));
815
+ W2AHELPER (puiUser -> usri1_home_dir , buffer , sizeof (buffer ));
783
816
SETPV (5 , buffer );
784
- WCTMB (puiUser -> usri1_comment , buffer , sizeof (buffer ));
817
+ W2AHELPER (puiUser -> usri1_comment , buffer , sizeof (buffer ));
785
818
SETPV (6 , buffer );
786
819
SETIV (7 , puiUser -> usri1_flags );
787
- WCTMB (puiUser -> usri1_script_path , buffer , sizeof (buffer ));
820
+ W2AHELPER (puiUser -> usri1_script_path , buffer , sizeof (buffer ));
788
821
SETPV (8 , buffer );
789
822
NetApiBufferFree (puiUser );
790
823
}
@@ -914,7 +947,7 @@ XS(XS_NT__NetAdmin_GetUsers)
914
947
if (lastError != 0 && lastError != ERROR_MORE_DATA )
915
948
break ;
916
949
for (index = 0 ; index < entriesRead ; ++ index ) {
917
- WCTMB (pwzUsers [index ].usri0_name , buffer , sizeof (buffer ));
950
+ W2AHELPER (pwzUsers [index ].usri0_name , buffer , sizeof (buffer ));
918
951
av_push ((AV * )sv , newSVpv (buffer , 0 ));
919
952
}
920
953
NetApiBufferFree (pwzUsers );
@@ -932,8 +965,8 @@ XS(XS_NT__NetAdmin_GetUsers)
932
965
if (lastError != 0 && lastError != ERROR_MORE_DATA )
933
966
break ;
934
967
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 ,
937
970
sizeof (buffer1 ));
938
971
hv_store ((HV * )sv , buffer , strlen (buffer ),
939
972
newSVpv (buffer1 ,0 ), 0 );
@@ -982,7 +1015,7 @@ XS(XS_NT__NetAdmin_GetTransports)
982
1015
if (lastError != 0 && lastError != ERROR_MORE_DATA )
983
1016
break ;
984
1017
for (index = 0 ; index < entriesRead ; ++ index ) {
985
- WCTMB (pws [index ].wkti0_transport_name , buffer ,
1018
+ W2AHELPER (pws [index ].wkti0_transport_name , buffer ,
986
1019
sizeof (buffer ));
987
1020
av_push ((AV * )sv , newSVpv (buffer , 0 ));
988
1021
}
@@ -1010,12 +1043,12 @@ XS(XS_NT__NetAdmin_GetTransports)
1010
1043
"number_of_vcs" ,
1011
1044
strlen ("number_of_vcs" ),
1012
1045
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 ));
1014
1047
hv_store (hvTemp ,
1015
1048
"transport_name" ,
1016
1049
strlen ("transport_name" ),
1017
1050
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 ));
1019
1052
hv_store (hvTemp ,
1020
1053
"transport_address" ,
1021
1054
strlen ("transport_address" ),
@@ -1073,7 +1106,7 @@ XS(XS_NT__NetAdmin_LoggedOnUsers)
1073
1106
if (lastError != 0 && lastError != ERROR_MORE_DATA )
1074
1107
break ;
1075
1108
for (index = 0 ; index < entriesRead ; ++ index ) {
1076
- WCTMB (pwzUser0 [index ].wkui0_username , buffer , sizeof (buffer ));
1109
+ W2AHELPER (pwzUser0 [index ].wkui0_username , buffer , sizeof (buffer ));
1077
1110
av_push ((AV * )sv , newSVpv (buffer , 0 ));
1078
1111
}
1079
1112
NetApiBufferFree (pwzUser0 );
@@ -1091,10 +1124,10 @@ XS(XS_NT__NetAdmin_LoggedOnUsers)
1091
1124
if (lastError != 0 && lastError != ERROR_MORE_DATA )
1092
1125
break ;
1093
1126
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 ,
1096
1129
sizeof (logon_domain ));
1097
- WCTMB (pwzUser1 [index ].wkui1_logon_server , logon_server ,
1130
+ W2AHELPER (pwzUser1 [index ].wkui1_logon_server , logon_server ,
1098
1131
sizeof (logon_server ));
1099
1132
sprintf (buffer1 ,"%s;%s;%s" , buffer , logon_domain ,
1100
1133
logon_server );
@@ -1172,7 +1205,7 @@ XS(XS_NT__NetAdmin_GroupGetAttributes)
1172
1205
lastError = NetGroupGetInfo (lpwServer , lpwGroup , 2 ,
1173
1206
(LPBYTE * )& pgroupInfo );
1174
1207
if (lastError == 0 ) {
1175
- WCTMB (pgroupInfo -> grpi2_comment , buffer , sizeof (buffer ));
1208
+ W2AHELPER (pgroupInfo -> grpi2_comment , buffer , sizeof (buffer ));
1176
1209
SETPV (2 , buffer );
1177
1210
NetApiBufferFree (pgroupInfo );
1178
1211
}
@@ -1386,7 +1419,7 @@ XS(XS_NT__NetAdmin_GroupGetMembers)
1386
1419
if (lastError != 0 && lastError != ERROR_MORE_DATA )
1387
1420
break ;
1388
1421
for (index = 0 ; index < entriesRead ; ++ index ) {
1389
- WCTMB (pwzGroupUsers [index ].grui0_name ,
1422
+ W2AHELPER (pwzGroupUsers [index ].grui0_name ,
1390
1423
buffer , sizeof (buffer ));
1391
1424
av_push ((AV * )sv , newSVpv (buffer , 0 ));
1392
1425
}
@@ -1460,7 +1493,7 @@ XS(XS_NT__NetAdmin_LocalGroupGetAttributes)
1460
1493
AllocWideName ((char * )SvPV (ST (1 ),n_a ), lpwGroup );
1461
1494
lastError = NetLocalGroupGetInfo (lpwServer , lpwGroup , 1 , (LPBYTE * )& pgroupInfo );
1462
1495
if (lastError == 0 ) {
1463
- WCTMB (pgroupInfo -> lgrpi1_comment , buffer , sizeof (buffer ));
1496
+ W2AHELPER (pgroupInfo -> lgrpi1_comment , buffer , sizeof (buffer ));
1464
1497
SETPV (2 , buffer );
1465
1498
NetApiBufferFree (pgroupInfo );
1466
1499
}
@@ -1605,9 +1638,19 @@ XS(XS_NT__NetAdmin_LocalGroupIsMember)
1605
1638
STRLEN n_a ;
1606
1639
#if 1
1607
1640
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 );
1611
1654
if (ERROR_SUCCESS != lastError )
1612
1655
XSRETURN_NO ;
1613
1656
@@ -1630,6 +1673,8 @@ XS(XS_NT__NetAdmin_LocalGroupIsMember)
1630
1673
NetApiBufferFree (pwzMembersInfo );
1631
1674
} while (bReturn == FALSE &&
1632
1675
(lastError == ERROR_MORE_DATA || resumeHandle != 0 ));
1676
+
1677
+ free (pSid );
1633
1678
FreeWideName (lpwServer );
1634
1679
FreeWideName (lpwGroup );
1635
1680
#else
@@ -1695,7 +1740,7 @@ XS(XS_NT__NetAdmin_LocalGroupGetMembers)
1695
1740
if (lastError != 0 && lastError != ERROR_MORE_DATA )
1696
1741
break ;
1697
1742
for (index = 0 ; index < entriesRead ; ++ index ) {
1698
- WCTMB (pwzMembersInfo [index ].lgrmi1_name , buffer ,
1743
+ W2AHELPER (pwzMembersInfo [index ].lgrmi1_name , buffer ,
1699
1744
sizeof (buffer ));
1700
1745
av_push ((AV * )sv , newSVpv (buffer , 0 ));
1701
1746
}
@@ -1746,7 +1791,7 @@ XS(XS_NT__NetAdmin_LocalGroupGetMembersWithDomain)
1746
1791
if (lastError != 0 && lastError != ERROR_MORE_DATA )
1747
1792
break ;
1748
1793
for (index = 0 ; index < entriesRead ; ++ index ) {
1749
- WCTMB (pwzMembersInfo [index ].lgrmi2_domainandname , buffer ,
1794
+ W2AHELPER (pwzMembersInfo [index ].lgrmi2_domainandname , buffer ,
1750
1795
sizeof (buffer ));
1751
1796
av_push ((AV * )sv , newSVpv (buffer , 0 ));
1752
1797
}
@@ -1768,7 +1813,7 @@ XS(XS_NT__NetAdmin_LocalGroupGetMembersWithDomain)
1768
1813
if (lastError != 0 && lastError != ERROR_MORE_DATA )
1769
1814
break ;
1770
1815
for (index = 0 ; index < entriesRead ; ++ index ) {
1771
- WCTMB (pwzMembersInfo [index ].lgrmi2_domainandname , buffer ,
1816
+ W2AHELPER (pwzMembersInfo [index ].lgrmi2_domainandname , buffer ,
1772
1817
sizeof (buffer ));
1773
1818
sprintf (buffer1 , "%d" , pwzMembersInfo [index ].lgrmi2_sidusage );
1774
1819
hv_store ((HV * )sv , buffer , strlen (buffer ),
@@ -1822,7 +1867,7 @@ XS(XS_NT__NetAdmin_GetServers)
1822
1867
if (lastError != 0 && lastError != ERROR_MORE_DATA )
1823
1868
break ;
1824
1869
for (index = 0 ; index < entriesRead ; ++ index ) {
1825
- WCTMB (pwzServerInfo [index ].sv100_name , buffer ,
1870
+ W2AHELPER (pwzServerInfo [index ].sv100_name , buffer ,
1826
1871
sizeof (buffer ));
1827
1872
av_push ((AV * )sv , newSVpv (buffer , 0 ));
1828
1873
}
@@ -1844,9 +1889,9 @@ XS(XS_NT__NetAdmin_GetServers)
1844
1889
if (lastError != 0 && lastError != ERROR_MORE_DATA )
1845
1890
break ;
1846
1891
for (index = 0 ; index < entriesRead ; ++ index ) {
1847
- WCTMB (pwzServerInfo101 [index ].sv101_name , buffer ,
1892
+ W2AHELPER (pwzServerInfo101 [index ].sv101_name , buffer ,
1848
1893
sizeof (buffer ));
1849
- WCTMB (pwzServerInfo101 [index ].sv101_comment , buffer1 ,
1894
+ W2AHELPER (pwzServerInfo101 [index ].sv101_comment , buffer1 ,
1850
1895
sizeof (buffer1 ));
1851
1896
hv_store ((HV * )sv , buffer , strlen (buffer ),
1852
1897
newSVpv (buffer1 ,0 ), 0 );
@@ -1897,7 +1942,7 @@ XS(XS_NT__NetAdmin_GetServerDisks)
1897
1942
break ;
1898
1943
p = disks ;
1899
1944
for (index = 0 ; index < entriesRead ; ++ index ) {
1900
- WCTMB (p , buffer , sizeof (buffer ));
1945
+ W2AHELPER (p , buffer , sizeof (buffer ));
1901
1946
av_push ((AV * )sv , newSVpv (buffer , strlen (buffer )));
1902
1947
p += 3 ;
1903
1948
}
@@ -1947,7 +1992,7 @@ XS(XS_NT__NetAdmin_GetAliasFromRID)
1947
1992
}
1948
1993
if (bSuccess )
1949
1994
{
1950
- WCTMB (Name , buffer , sizeof (buffer ));
1995
+ W2AHELPER (Name , buffer , sizeof (buffer ));
1951
1996
SETPV (2 ,buffer );
1952
1997
}
1953
1998
FreeWideName (lpwServer );
@@ -2032,7 +2077,7 @@ XS(XS_NT__NetAdmin_GetUserGroupFromRID)
2032
2077
NetApiBufferFree (umi2 );
2033
2078
if (bSuccess )
2034
2079
{
2035
- WCTMB (Name , buffer , sizeof (buffer ));
2080
+ W2AHELPER (Name , buffer , sizeof (buffer ));
2036
2081
SETPV (2 ,buffer );
2037
2082
}
2038
2083
FreeWideName (lpwServer );
0 commit comments