powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / глюк при работе с API-функциями
6 сообщений из 6, страница 1 из 1
глюк при работе с API-функциями
    #34489393
Александр Третьяков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VFP9.0SP1, Win2000SP4
Привожу кусок кода, проблема в том что функция GetSecurityDescriptorDacl возвращает указатель pDacl, я проверяю правильный ли он IsValidAcl, первый раз возвращает 1, нормально.
Но потом бывает с 3 или 4-й позиции начинает возвращать 0. А иногда на седьмой начинает возвращать 1. Самое интересное каждый раз по другому. Первый раз IsValidAcl всегда возвращает 1, а потом как карта ляжет...

Такое ощущение что что Фокс как-то неправильно работает с памятью. Я часто использую API, но такое впервые.... Писать fll, как-то влом...
Народ у вас біли какието проблемі с API?

Код: plaintext
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.
DECLARE LONG GetSecurityDescriptorDacl IN advapi32;  
  	    String pSecurityDescriptor,;  
      	INTEGER @lpbDaclPresent,;  
  	    LONG @pDacl,;  
      	INTEGER @lpbDaclDefaulted  
    
  	DECLARE INTEGER IsValidAcl IN advapi32;  
  		LONG pAcl  
    
  local pDacl  
  pDacl= 0   
  lnResult=GetSecurityDescriptorDacl(lcSecurityDescriptor,@lpbDaclPresent,@pDacl,@lpbDaclDefaulted)  
    
  ?'1IsValidAcl pDacl=',IsValidAcl(pDacl),' pDacl=',pDacl  
  ?--------------  
  ?'2IsValidAcl pDacl=',IsValidAcl(pDacl),' pDacl=',pDacl  
  ?--------------  
  ?'3IsValidAcl pDacl=',IsValidAcl(pDacl),' pDacl=',pDacl  
  ?--------------  
  ?'4IsValidAcl pDacl=',IsValidAcl(pDacl),' pDacl=',pDacl  
  ?--------------  
  ?--------------  
  ?'5IsValidAcl pDacl=',IsValidAcl(pDacl),' pDacl=',pDacl  
  ?--------------  
  ?--------------  
  ?'6IsValidAcl pDacl=',IsValidAcl(pDacl),' pDacl=',pDacl  
  ?--------------  
  ?'7IsValidAcl pDacl=',IsValidAcl(pDacl),' pDacl=',pDacl
...
Рейтинг: 0 / 0
глюк при работе с API-функциями
    #34489451
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И где описание параметров lcSecurityDescriptor, lpbDaclPresent, lpbDaclDefaulted?
...
Рейтинг: 0 / 0
глюк при работе с API-функциями
    #34489939
Александр Третьяков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я привожу весь тект програми это prg-файл, вы попробуйте несколько раз его выполнить
это ключ рееестра на который я открываю доступ
SAM\SAM\Domains\Account\Users\000003EE
Я хочу открыть доступ на ветку реестра, для того чтобы переписать хеш-пароль в учетную запи

Код: plaintext
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
...
Рейтинг: 0 / 0
глюк при работе с API-функциями
    #34489950
Александр Третьяков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы смотрите как меняеться результат, выполните несколько раз
?'IsValidAcl pDacl=',IsValidAcl(pDacl),' pDacl=',pDacl
...
Рейтинг: 0 / 0
глюк при работе с API-функциями
    #34490380
Александр Третьяков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А теперь самое интересное, если этот же код поставить в кнопку на форме... то все работает как часы... из prg не работает, а с формы работает. К этому дошли потому что такие же проблемы есть и с другими функциями NetUserAdd и т.д. у моего напарника. Он сначала сделал форму и данные выводил туда по кнопке, все супер. Потом перенес все в один prg запустил его и теперь иногда возвращает бред.

Проблему обошли но осадок остался...
продолжение в
http://]http://forum.foxclub.ru/read.php?29,270090,270178#msg-270178
...
Рейтинг: 0 / 0
глюк при работе с API-функциями
    #34496460
Александр Третьяков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тема закрыта
ответ в
http://forum.foxclub.ru/read.php?29,270090,270853#msg-270853
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / глюк при работе с API-функциями
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]