| ||||
| ||||
Здравствуйте ! Когда-то была написана функция, которая перебирала все доступные ключевые контейнеры и отбирала те из них, которые находятся на носителях "дискета" и возвращала имя первого найденного. Функция нормально работала с CSP 2.0. Однако в CSP 3.0 (3.0.3293) контейнеры с дискет в цикл перебора просто не попадают, хотя аплет их показывает и нормально с ними работает. При этом контейнеры из реестра в цикл перебора попадают. Пробовал передавать в CryptAcquireContext не PROV_GOST_94_DH=71, а 75 - результат не меняется. Где я ошибаюсь ? С уважением, Михальский А. function ExistsFloppyContainer( var ContainerName,floppy_drive_name: string ) : Boolean; const CRYPT_FQCN = $10; CRYPT_UNIQUE = $8; SIGN_ = '\\.\FAT12_'; var Context: HCRYPTPROV; pbData : PBYTE; cbData : DWORD; s : string; containers : TStringList; i : integer; begin Result := False; containers := TStringList.Create; try if CryptAcquireContext(@Context, nil, nil, PROV_GOST_94_DH, CRYPT_VERIFYCONTEXT ) then try if CryptGetProvParam(Context, PP_ENUMCONTAINERS, nil, @cbData, CRYPT_FIRST or CRYPT_FQCN or CRYPT_UNIQUE ) then try GetMem(pbData, cbData); while True do begin if CryptGetProvParam(Context, PP_ENUMCONTAINERS, pbData, @cbData, CRYPT_FQCN or CRYPT_UNIQUE ) then begin SetString( s, PChar(pbData), cbData ); if Pos( SIGN_, s ) = 1 then containers.Add( trim( s ) ); end else break; end; finally FreeMem(pbData); end; finally CryptReleaseContext(Context, 0); end else RaiseLastWin32Error; if containers.Count < 1 then Exit; Result := True; s := containers[0]; for i := length(s) downto 1 do if s[i] = '\' then break; ContainerName := copy( s,i+1,MaxInt ); floppy_drive_name := copy( s,length(SIGN_)+1,1 ); finally containers.Free; end; end; | ||||
Ответы: | ||||
| ||||
В первой итерации while не хватате CRYPT_FIRST | ||||
| ||||
Да, действительно. Большое спасибо ! | ||||