18.06.2007 13:08:27Вопрос по перебору контейнеров ключей в CSP 3 Ответов: 2
Михальский Александр
Здравствуйте !
Когда-то была написана функция, которая перебирала
все доступные ключевые контейнеры и отбирала те из
них, которые находятся на носителях "дискета" и возвращала имя первого найденного.
Функция нормально работала с 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;





 
Ответы:
18.06.2007 13:25:16maxdm
В первой итерации while не хватате CRYPT_FIRST
18.06.2007 13:35:51Михальский Александр
Да, действительно.
Большое спасибо !