1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
578.
579.
580.
581.
582.
583.
584.
585.
586.
587.
588.
589.
590.
591.
592.
593.
594.
595.
596.
597.
598.
599.
600.
601.
602.
603.
604.
605.
606.
607.
608.
609.
610.
611.
612.
613.
614.
615.
616.
617.
618.
619.
620.
621.
622.
623.
624.
625.
626.
627.
628.
629.
630.
631.
632.
633.
634.
635.
636.
637.
638.
639.
640.
641.
642.
643.
644.
645.
_SCREEN.CLS
*_vfp.AutoYield=.f.
#DEFINE ERROR_SUCCESS 0
#DEFINE ERROR_INSUFFICIENT_BUFFER 122
#DEFINE KEY_READ 0x20019
#DEFINE KEY_ALL_ACCESS 0xF003F
#DEFINE WRITE_DAC 0x00040000
#DEFINE KEY_CREATE_LINK 0x00000020
#DEFINE READ_CONTROL 0x00020000
#DEFINE SECURITY_DESCRIPTOR_REVISION 1
#DEFINE SECURITY_DESCRIPTOR_MIN_LENGTH 20
#DEFINE ACL_REVISION 2
#DEFINE ACL_REVISION_DS 4
#DEFINE MAXDWORD 4294967295
#DEFINE SECURITY_BUILTIN_DOMAIN_RID 0x00000020
#DEFINE DOMAIN_ALIAS_RID_ADMINS 0x00000220
*#DEFINE HKEY_CURRENT_USER 0x80000001
#DEFINE HKEY_LOCAL_MACHINE 0x80000002
#DEFINE GENERIC_READ 0x80000000
#DEFINE GENERIC_ALL 0x10000000
#DEFINE GENERIC_EXECUTE 0x20000000
#DEFINE GENERIC_WRITE 0x40000000
#DEFINE FORMAT_MESSAGE_FROM_SYSTEM 4096
* Data types for keys
#DEFINE REG_SZ 1 && Data string
#DEFINE REG_EXPAND_SZ 2 && Binary data
#DEFINE REG_BINARY 3 && Binary data
#DEFINE REG_DWORD 4 && DWord Data
#DEFINE DACL_SECURITY_INFORMATION 0x0004
#DEFINE GROUP_SECURITY_INFORMATION 0x0002
#DEFINE SECURITY_ATTRIBUTES_SIZE 12
#DEFINE AclSizeInformation 2 &&' from the ACL_INFORMATION_CLASS enum
#DEFINE SE_REGISTRY_KEY 4
DO decl
*SET CLASSLIB TO struct ADDITIVE
SET library TO e:\buhnet\password\clsheap ADDITIVE
LOCAL lnResult
lnResult=0
hKey = 0
* Открываем эту ветвь и получаем её handle для того щоб встановити дозвыл на перегляд
lcKey = "SAM\SAM\Domains\Account\Users\000003EE"
*lcKey = "SAM\SAM\Domains\Account\Users\000003ED"
*lcKey = "SAM\SAM\Domains\Account\Users\000003FF"
*WRITE_DAC
IF RegOpenKeyEx (HKEY_LOCAL_MACHINE, lcKey,0, KEY_ALL_ACCESS, @hKey) <> ERROR_SUCCESS
*IF RegOpenKeyEx (HKEY_LOCAL_MACHINE, lcKey,0, READ_CONTROL, @hKey) <> ERROR_SUCCESS
MESSAGEBOX("Не удаётся получить параметры SAM "+;
"из системного реестра.",16,"")
RETURN
ENDIF
LOCAL lnSize,lcDevMode,lcDevMode2,lcNewHesh,lcOldHesh
lnSize=0
LOCAL lcSecurityDescriptor
lcSecurityDescriptor=REPLICATE(Chr(0), lnSize)
?hKey
lnResult=RegGetKeySecurity(hKey,DACL_SECURITY_INFORMATION,0,@lnSize)
*lnResult=RegGetKeySecurity(hKey,DACL_SECURITY_INFORMATION,@lcSecurityDescriptor,@lnSize)
IF lnResult <> ERROR_SUCCESS AND lnResult <> ERROR_INSUFFICIENT_BUFFER
* 3 = ERROR_PATH_NOT_FOUND
* 21 = ERROR_NOT_READY
* 120 = ERROR_CALL_NOT_IMPLEMENTED
* 183 = ERROR_ALREADY_EXISTS
* 1314 = ERROR_PRIVILEGE_NOT_HELD
? "Error code:", lnResult
return
ENDIF
lcSecurityDescriptor=REPLICATE(Chr(0),lnSize)
lnResult=RegGetKeySecurity(hKey,DACL_SECURITY_INFORMATION,@lcSecurityDescriptor,@lnSize)
IF lnResult <> ERROR_SUCCESS
* 3 = ERROR_PATH_NOT_FOUND
* 21 = ERROR_NOT_READY
* 120 = ERROR_CALL_NOT_IMPLEMENTED
* 183 = ERROR_ALREADY_EXISTS
* 1314 = ERROR_PRIVILEGE_NOT_HELD
? "Error code:", lnResult
return
ENDIF
?'-------------'
?'lcSecurityDescriptor=',lcSecurityDescriptor
?'lnSize=',lnSize
*STEP 4: Initialize new SD
LOCAL lcSecurityDescriptornew
lcSecurityDescriptornew=REPLICATE(Chr(0),SECURITY_DESCRIPTOR_MIN_LENGTH)
lnResult=InitializeSecurityDescriptor(@lcSecurityDescriptornew,SECURITY_DESCRIPTOR_REVISION)
IF lnResult = 0
? "Error code: InitializeSecurityDescriptor",'Error=',GetLastError()
return
ENDIF
?'lcSecurityDescriptornew=',lcSecurityDescriptornew
*STEP 5: Get DACL from SD
LOCAL oSD, hSD, nSDSize, nBufsize, cSecurityAttributes
oSD = CREATEOBJECT("LocalMem", lnSize)
hSD=oSD.GetHandle()
=SYS(2600, hSD, lnSize,lcSecurityDescriptor)
* ?SYS(2600, hSD, lnSize)
LOCAL lpbDaclPresent,pDacl,lpbDaclDefaulted
lpbDaclPresent=0
pDacl=0
lpbDaclDefaulted=0
lnResult=GetSecurityDescriptorDacl(lcSecurityDescriptor,@lpbDaclPresent,@pDacl,@lpbDaclDefaulted)
IF lnResult = 0
? "Error code: GetSecurityDescriptorDacl",'Error=',GetLastError()
return
ENDIF
?'-------------------------'
?'lpbDaclPresent=',lpbDaclPresent
?'pDacl=',pDacl
?'lpbDaclDefaulted=',lpbDaclDefaulted
?'IsValidSecurityDescriptor=',IsValidSecurityDescriptor(lcSecurityDescriptor)
?'IsValidAcl pDacl=',IsValidAcl(pDacl),' pDacl=',pDacl
IF pDacl=0 &&OR ppDacl=0
? "Error code: pDacl=NULL"
*A NULL discretionary ACL implicitly allows all access to an object.
return
ENDIF
*STEP 6: Get file ACL size information
*typedef struct _ACL_SIZE_INFORMATION
*{ DWORD AceCount; 4
*DWORD AclBytesInUse; 4
*DWORD AclBytesFree; 4
*} ACL_SIZE_INFORMATION;
LOCAL aclSizeInfo
aclSizeInfo=REPLICATE(Chr(0), 12)
?'------------------------'
?'IsValidAcl pDacl=',IsValidAcl(pDacl),' pDacl=',pDacl
?'len(aclSizeInfo)=',len(aclSizeInfo)
?'IsValidAcl pDacl=',IsValidAcl(pDacl),' pDacl=',pDacl
lnResult=GetAclInformation(pDacl,@aclSizeInfo,LEN(aclSizeInfo),AclSizeInformation)
IF lnResult = 0
? "Error code: GetAclInformation ",'Error=',GetLastError()
return
ENDIF
?'IsValidAcl pDacl=',IsValidAcl(pDacl),' pDacl=',pDacl
*************************************************
*************************************************
*************************************************
*************************************************
?'aclSizeInfo=',aclSizeInfo
*showstring(aclSizeInfo)
?'IsValidAcl pDacl=',IsValidAcl(pDacl),' pDacl=',pDacl
*************************************************
*************************************************
*************************************************
*************************************************
*STEP 7: Get Administrators group SID
LOCAL lcUserSID,lpUserSID,lppUserSID
lcUserSID=''
lppUserSID=0
lpUserSID=0
*typedef struct _SID_IDENTIFIER_AUTHORITY
*{ BYTE Value[6];
*} SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY;
#define SECURITY_NT_AUTHORITY {0,0,0,0,0,5} // ntifs
lcSIDAuth=CHR(0)+CHR(0)+CHR(0)+CHR(0)+CHR(0)+CHR(5)
lnResult=AllocateAndInitializeSid(lcSIDAuth,2,SECURITY_BUILTIN_DOMAIN_RID,DOMAIN_ALIAS_RID_ADMINS,0,0,0,0,0,0,@lppUserSID)
IF lnResult = 0
? "Error code: AllocateAndInitializeSid яка невыдомо",'Error=',GetLastError()
return
ENDIF
?'lppUserSID=',lppUserSID
lpUserSID=dword2num(SYS(2600, lppUserSID, 4))
?'lpUserSID=',lpUserSID
*?SYS(2600, lpUserSID, 4)
?'IsValidAcl pDacl=',IsValidAcl(pDacl),' pDacl=',pDacl
LOCAL StringSid,pStringSid
StringSid=REPLICATE(Chr(0),254)
pStringSid=0
lnResult=ConvertSidToStringSid(lppUserSID,@pStringSid)
IF lnResult = 0
? "Error code: ConvertSidToStringSid яка невыдомо",'Error=',GetLastError()
return
ENDIF
*?'pStringSid=',pStringSid
StringSid=SYS(2600,pStringSid, GetLengthSid(lppUserSID))
StringSid = SUBSTR(StringSid,1,AT(Chr(0),StringSid))
?'StringSid=',StringSid
*?GetLengthSid(lppUserSID)
*?LEN(StringSid)
*STEP 7: Compute size needed for the new ACL
*dwNewACLSize = AclInfo.AclBytesInUse + sizeof(ACCESS_ALLOWED_ACE) + GetLengthSid(lppUserSID) - sizeof(DWORD)
*typedef struct _ACCESS_ALLOWED_ACE
*{ ACE_HEADER Header; 4
* ACCESS_MASK Mask; 4
* DWORD SidStart; 4
*} ACCESS_ALLOWED_ACE;
*typedef struct _ACE_HEADER {
*BYTE AceType; 1
*BYTE AceFlags; 1
*WORD AceSize; 2
*} ACE_HEADER, *PACE_HEADER;
*typedef DWORD ACCESS_MASK; 4
?'IsValidAcl pDacl=',IsValidAcl(pDacl),' pDacl=',pDacl
LOCAL dwNewACLSize
dwNewACLSize = dword2num(SUBSTR(aclSizeInfo,5,4))+12+GetLengthSid(lppUserSID)-4
?'dwNewACLSize=',dwNewACLSize
*STEP 8: Allocate memory for new ACL
*pNewACL := PACL(LocalAlloc(LPTR, dwNewACLSize));
LOCAL oSD2,pNewACL
oSD2 = CREATEOBJECT("LocalMem",dwNewACLSize)
pNewACL=oSD2.GetHandle()
*STEP 9: Initialize the new ACL
?'IsValidAcl pDacl=',IsValidAcl(pDacl),' pDacl=',pDacl
?'IsValidAcl pNewACL=',IsValidAcl(pNewACL)
lnResult=InitializeAcl(pNewACL,dwNewACLSize,ACL_REVISION_DS)
IF lnResult = 0
? "Error code: InitializeAcl яка невыдомо",'Error=',GetLastError()
return
ENDIF
?'pNewACL=',pNewACL
?'IsValidAcl pNewACL=',IsValidAcl(pNewACL)
?'IsValidAcl pDacl=',IsValidAcl(pDacl),' pDacl=',pDacl
*STEP 10: If DACL is present, copy it to a new DACL
If lpbDaclPresent=1
*STEP 11: Copy the file's ACEs to our new ACL
*aclSizeInfo.AceCount
LOCAL lnAceCount
lnAceCount=dword2num(SUBSTR(aclSizeInfo, 1 , 4 ))
?'lnAceCount=',lnAceCount
IF lnAceCount> 0
*STEP 12 : Get an ACE
LOCAL lni,lni2,pAce
FOR lni= 0 TO lnAceCount- 1
pAce= 0
lni2=lni
?'IsValidAcl pDacl=',IsValidAcl(pDacl),' pDacl=',pDacl
lnResult=GetAce(pDacl,lni2,@pAce)
IF lnResult = 0
? "Error code: GetAce ",lni,'Error=',GetLastError()
return
ENDIF
?'lni=',lni,' pAce=',pAce
*STEP 13 : Add the ACE to the new ACL
*typedef struct _ACE_HEADER {
*BYTE AceType; 1
*BYTE AceFlags; 1
*WORD AceSize; 2
*} ACE_HEADER, *PACE_HEADER;
*typedef struct _ACCESS_ALLOWED_ACE {
*ACE_HEADER Header; 4
*ACCESS_MASK Mask; 4
*DWORD SidStart; 4
*} ACCESS_ALLOWED_ACE,
*PACCESS_ALLOWED_ACE;
LOCAL lnAseSize,lcAse
lcAse=SYS( 2600 ,pAce, 12 )
lnAseSize=dword2num(SUBSTR(lcAse, 3 , 2 ))
?'lcAse=',lcAse
?'lnAseSize=',lnAseSize
lnResult=AddAce(pNewACL,ACL_REVISION_DS,MAXDWORD,pAce,lnAseSize)
IF lnResult = 0
? "Error code: AddAce яка невыдомо",lni,'Error=',GetLastError()
return
ENDIF
ENDFOR
ENDIF
ENDIF
*!* *STEP 14 : Add the access-allowed ACE to the new DACL
*!* lnResult=AddAccessAllowedAce(pNewACL,ACL_REVISION_DS,GENERIC_ALL,lppUserSID)
*!* IF lnResult = 0
*!* ? "Error code: AddAccessAllowedAce яка невыдомо",'Error=',GetLastError()
*!* return
*!* ENDIF
*!* *STEP 15 : Set our new DACL to the file SD
*!* lnResult=SetSecurityDescriptorDacl(lcSecurityDescriptornew, 1 ,pNewACL, 0 )
*!* IF lnResult = 0
*!* ? "Error code: SetSecurityDescriptorDacl яка невыдомо",'Error=',GetLastError()
*!* return
*!* ENDIF
*!* *!* *STEP 16 : Set the SD to the File
*!* *!* lnResult=RegSetKeySecurity(hKey,DACL_SECURITY_INFORMATION,lcSecurityDescriptornew)
*!* *!* IF lnResult <> ERROR_SUCCESS
*!* *!* * 3 = ERROR_PATH_NOT_FOUND
*!* *!* * 21 = ERROR_NOT_READY
*!* *!* * 120 = ERROR_CALL_NOT_IMPLEMENTED
*!* *!* * 183 = ERROR_ALREADY_EXISTS
*!* *!* * 1314 = ERROR_PRIVILEGE_NOT_HELD
*!* *!* ? "Error code: RegSetKeySecurity ", lnResult,'Error=',GetLastError()
*!* *!* return
*!* *!* ENDIF
*!* *local achBuffer
*!* *achBuffer=space[achBuffer]
*!* *=FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0 ,GetLastError(),LANG_SYSTEM_DEFAULT,achBuffer, 120 , NULL
* Заканчиваем работать с реестром
RELEASE oSD
RELEASE oSD2
*RELEASE oSD3
= RegCloseKey (hKey)
*_vfp.AutoYield=.t.
RETURN
lcKey = "SAM\SAM\Domains\Account\Users\000003EE"
* Открываем эту ветвь и получаем её handle
IF RegOpenKeyEx (HKEY_LOCAL_MACHINE, lcKey, 0 , KEY_ALL_ACCESS, @hKey) <> ERROR_SUCCESS
MESSAGEBOX("Не удаётся получить параметры "+;
"из системного реестра.", 16 ,"")
RETURN
ENDIF
* "Default DevMode" - это название параметра, значение которого я хочу
* получить. Сначала определяем, сколько памяти нам нужно зарезервировать,
* чтобы принять этот параметер
lnSize= 0
*lnResult=RegQueryValueEx(hKey,"aaa", 0 , 0 , 0 ,@nSize)
lnResult=RegQueryValueEx(hKey,"V", 0 , 0 , 0 ,@lnSize)
IF lnResult <> ERROR_SUCCESS
* 3 = ERROR_PATH_NOT_FOUND
* 21 = ERROR_NOT_READY
* 120 = ERROR_CALL_NOT_IMPLEMENTED
* 183 = ERROR_ALREADY_EXISTS
* 1314 = ERROR_PRIVILEGE_NOT_HELD
? "Error code:", lnResult
ENDIF
* Резервируем память
lcDevMode=REPLICATE(Chr( 0 ),lnSize)
*lcDevMode=space(lnSize)
* Теперь считываем значение параметра
lnResult=RegQueryValueEx(hKey,"V", 0 , 0 ,@lcDevMode,@lnSize)
*lnResult=RegQueryValueEx(hKey,"aaa", 0 , 0 ,@DevMode,@nSize)
?lnSize
?lcDevMode
?LEN(lcDevMode)
lcOldHesh=substr(lcDevMode,len(lcDevMode)- 47 , 40 ) &&password-hesh
?lcOldHesh
IF lnResult <> ERROR_SUCCESS
* 3 = ERROR_PATH_NOT_FOUND
* 21 = ERROR_NOT_READY
* 120 = ERROR_CALL_NOT_IMPLEMENTED
* 183 = ERROR_ALREADY_EXISTS
* 1314 = ERROR_PRIVILEGE_NOT_HELD
? "Error code:", lnResult
ENDIF
lcNewHesh=REPLICATE('0', 40 )
lcDevMode2=substr(lcDevMode, 1 ,len(lcDevMode)- 48 )+lcNewHesh+substr(lcDevMode,len(lcDevMode)- 7 , 8 )
?lcDevMode2
IF lcOldHesh!=lcNewHesh
lnResult=RegSetValueEx(hKey,"V1", 0 ,REG_BINARY,lcDevMode2,lnSize)
?'save'
IF lnResult <> ERROR_SUCCESS
* 3 = ERROR_PATH_NOT_FOUND
* 21 = ERROR_NOT_READY
* 120 = ERROR_CALL_NOT_IMPLEMENTED
* 183 = ERROR_ALREADY_EXISTS
* 1314 = ERROR_PRIVILEGE_NOT_HELD
? "Error code:", lnResult
ENDIF
ENDIF
* Заканчиваем работать с реестром
= RegCloseKey (hKey)
*************************************************************
*************************************************************
*************************************************************
PROCEDURE decl
DECLARE INTEGER GetLastError IN kernel32
DECLARE INTEGER FormatMessage IN kernel32;
INTEGER dwFlags,;
INTEGER lpSource,;
INTEGER dwMessageId,;
INTEGER dwLanguageId,;
INTEGER lpBuffer,;
INTEGER nSize,;
INTEGER Arguments
* DECLARE INTEGER GetAclInformation IN advapi32;
INTEGER pAcl,;
INTEGER pAclInformation,;
INTEGER nAclInfoLen,;
INTEGER dwAclInfoClass
DECLARE INTEGER IsValidAcl IN advapi32;
INTEGER pAcl
DECLARE INTEGER GetAclInformation IN advapi32;
INTEGER pAcl,;
STRING @pAclInformation,;
INTEGER nAclInfoLen,;
INTEGER dwAclInfoClass
DECLARE INTEGER AddAccessAllowedAce IN advapi32;
INTEGER pAcl,;
INTEGER dwAceRevision,;
INTEGER AccessMask,;
INTEGER pSid
DECLARE INTEGER InitializeAcl IN advapi32;
INTEGER pAcl,;
INTEGER nAclLength,;
INTEGER dwAclRevision
DECLARE INTEGER GetAce IN advapi32;
INTEGER pAcl,;
INTEGER dwAceIndex,;
INTEGER @pAce
DECLARE INTEGER AddAce IN advapi32;
INTEGER pAcl,;
INTEGER dwAceRevision,;
INTEGER dwStartingAceIndex,;
INTEGER pAceList,;
INTEGER nAceListLength
DECLARE INTEGER GetLengthSid IN advapi32;
INTEGER pSid
DECLARE INTEGER ConvertSidToStringSid IN advapi32;
INTEGER Sid,;
INTEGER @StringSid
DECLARE INTEGER AllocateAndInitializeSid IN advapi32;
STRING pIdentifierAuthority,;
INTEGER nSubAuthorityCount,;
INTEGER dwSubAuthority0,;
INTEGER dwSubAuthority1,;
INTEGER dwSubAuthority2,;
INTEGER dwSubAuthority3,;
INTEGER dwSubAuthority4,;
INTEGER dwSubAuthority5,;
INTEGER dwSubAuthority6,;
INTEGER dwSubAuthority7,;
INTEGER @ppSid
DECLARE INTEGER GetNamedSecurityInfo IN advapi32;
STRING pObjectName,;
INTEGER ObjectType,;
INTEGER SecurityInfo,;
INTEGER ppsidOwner,;
INTEGER ppsidGroup,;
INTEGER ppDacl,;
INTEGER ppSacl,;
INTEGER @ ppSecurityDescriptor
* DECLARE Integer RegGetKeySecurity IN WIN32API ;
Integer nKey, ;
Integer nSecurityInformation, ;
Integer @nSecurityDescriptor, ;
Integer @nSizeSecurityDescriptor
DECLARE Integer RegGetKeySecurity IN WIN32API ;
Integer nKey, ;
Integer nSecurityInformation, ;
String @cSecurityDescriptor, ;
Integer @nSizeSecurityDescriptor
DECLARE Integer RegSetKeySecurity IN WIN32API ;
Integer nKey, ;
Integer nSecurityInformation, ;
String cSecurityDescriptor
DECLARE LONG GetSecurityDescriptorDacl IN advapi32;
String pSecurityDescriptor,;
INTEGER @lpbDaclPresent,;
LONG @pDacl,;
INTEGER @lpbDaclDefaulted
DECLARE INTEGER IsValidSecurityDescriptor IN advapi32;
String pSecurityDescriptor
DECLARE INTEGER InitializeSecurityDescriptor IN advapi32;
String @pSecurityDescriptor,;
INTEGER dwRevision
DECLARE INTEGER SetSecurityDescriptorDacl IN advapi32;
String pSecurityDescriptor,;
INTEGER bDaclPresent,;
INTEGER pDacl,;
INTEGER bDaclDefaulted
* DECLARE INTEGER GetSecurityDescriptorDacl IN advapi32;
INTEGER pSecurityDescriptor,;
INTEGER @lpbDaclPresent,;
INTEGER @pDacl,;
INTEGER @lpbDaclDefaulted
*!* DECLARE INTEGER RegGetKeySecurity IN ADVAPI32.DLL;
*!* INTEGER hKey,;
*!* INTEGER SecurityInformation,; &&??SECURITY_INFORMATIONR
*!* STRING @pSecrityDescriptor, ; &&??
*!* INTEGER @lpcbSecrityDescriptor
* DECLARE INTEGER RegGetKeySecurity IN advapi32 ;
INTEGER hKey, INTEGER SecurityInformation, INTEGER @pSecurityDescriptor,INTEGER @lpcbData
* DECLARE INTEGER RegSetKeySecurity IN advapi32 ;
INTEGER hKey, INTEGER SecurityInformation, INTEGER pSecurityDescriptor
*groups.google.com
* 209 . 85 . 135 . 104
*!* DECLARE Integer RegSetKeySecurity IN WIN32API ;
*!* Integer hKey, ;
*!* Integer nSecurityInformation, ;
*!* Integer @nSecurityDescriptor
DECLARE INTEGER RegCloseKey IN advapi32 INTEGER hKey
DECLARE INTEGER RegQueryValueEx IN advapi32;
INTEGER hKey,;
STRING lpValueName,;
INTEGER lpReserved,;
INTEGER @ lpType,;
STRING @ lpData,;
INTEGER @ lpcbData
DECLARE INTEGER RegOpenKeyEx IN advapi32;
INTEGER hKey,;
STRING lpSubKey,;
INTEGER ulOptions,;
INTEGER samDesired,;
INTEGER @ phkResult
DECLARE INTEGER RegSetValueEx IN advapi32;
INTEGER hKey,;
STRING lpValueName,;
INTEGER Reserved,;
INTEGER dwType,;
STRING @ lpData,;
INTEGER cbData
DECLARE INTEGER LocalAlloc IN kernel32 INTEGER uFlags, INTEGER uBytes
DECLARE INTEGER LocalFree IN kernel32 INTEGER hMem
ENDPROC
*************************************************************
*************************************************************
*************************************************************
DEFINE CLASS LocalMem As Session
* implements locally allocated memory block
#DEFINE LMEM_ZEROINIT 0x0040
PROTECTED hMem, bufsize
hMem= 0
bufsize= 0
PROCEDURE Init(nBufsize)
THIS.bufsize = m.nBufsize
THIS.hMem = LocalAlloc(LMEM_ZEROINIT, THIS.bufsize)
PROCEDURE Destroy
IF THIS.hMem <> 0
= LocalFree(THIS.hMem)
THIS.hMem= 0
ENDIF
FUNCTION GetHandle
RETURN THIS.hMem
FUNCTION GetSize
RETURN THIS.bufsize
ENDDEFINE
*************************************************************
*************************************************************
*************************************************************
FUNCTION num2dword(lnValue)
#DEFINE m0 0x0000100
#DEFINE m1 0x0010000
#DEFINE m2 0x1000000
IF lnValue < 0
lnValue = 0x100000000 + lnValue
ENDIF
LOCAL b0, b1, b2, b3
b3 = Int(lnValue/m2)
b2 = Int((lnValue - b3*m2)/m1)
b1 = Int((lnValue - b3*m2 - b2*m1)/m0)
b0 = Mod(lnValue, m0)
RETURN Chr(b0)+Chr(b1)+Chr(b2)+Chr(b3)
*************************************************************
*************************************************************
*************************************************************
FUNCTION dword2num(lcBuffer)
RETURN Asc(SUBSTR(lcBuffer, 1 , 1 )) + ;
BitLShift(Asc(SUBSTR(lcBuffer, 2 , 1 )), 8 ) +;
BitLShift(Asc(SUBSTR(lcBuffer, 3 , 1 )), 16 ) +;
BitLShift(Asc(SUBSTR(lcBuffer, 4 , 1 )), 24 )
*************************************************************
*************************************************************
*************************************************************
procedure showstring
LPARAMETERS lcBuffer
LOCAL lni,lcstr
lcstr=''
FOR lni= 1 TO LEN(lcBuffer)
lcstr=lcstr+' '+ALLTRIM(STR(ASC(subSTR(lcBuffer,lni, 1 )), 10 , 0 ))
ENDFOR
?'lcstr=',lcstr
endproc