Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
Krad Nale

Uso de api´s no delphi / c

Recommended Posts

Olá . . .

Gostaria de saber se alguém aí sabe manipular API´s, pois estou com um probleminha.

1° com a API WNetEnumCachedPasswords. Sua declaração seria . . .

WNetEnumCachedPasswords(lp: lpStr; w: Word; b: Byte; PC: PChar; dw: DWord): Word;

Isso seria em Delphi, segundo o que me passaram.Toda vez que tento rodar a aplicação, ocorre uma violação de acesso no arquivo "shell32.dll" e meu PC trava ou fica dando pau. Gostaria de saber o porquê disso, tentei usar ponteiros para buffers de texto (para pegar os passwords), PChars . . . mas nada ! ! !

E gostaria também de saber como usar o "Shell Icon Cache" do Windows, é uma função bem interessante.

Para quem se interessou sobre API, visitem Windows Undocumented, mas os códigos estão em C, mas não é muito difícil passá-los para Delphi ou VB.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado Originalmente por Krad Nale@01 Set. 2002,17:45

WNetEnumCachedPasswords(lp: lpStr; w: Word; b: Byte; PC: PChar; dw: DWord): Word;

Isso seria em Delphi, segundo o que me passaram.Toda vez que tento rodar a aplicação, ocorre uma violação de acesso no arquivo "shell32.dll" e meu PC trava ou fica dando pau. Gostaria de saber o porquê disso, tentei usar ponteiros para buffers de texto (para pegar os passwords), PChars . . . mas nada ! ! !

<font color='#000080'>Que tal se você postar a linha do código que você está tentando usar? (e obviamene as declarações das variáveis também).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem (depois da demora em postar o código), começamos com uma declaração do handle da constante mpr (C:\Windows\mpr.dll), e um contador.

  public

    hMPR: THandle;

  end;

  const

    Count: Integer = 0;

Aí vem a declaração da função...

function WNetEnumCachedPasswords(lp: lpStr; w: Word; b: Byte; PC: PChar; dw: DWord): Word; stdcall;

... de novo (na seção implementation) ...

function WNetEnumCachedPasswords(lp: lpStr; w: Word; b: Byte; PC: PChar; dw: DWord): Word; external mpr name 'WNetEnumCachedPasswords';

Agora vem uma declaração de tipo que não entendi (apenas sei que é a estrutura da password encriptada, que é recebida por este type e organizada pela função "AddPassword" mais adiante)

type

PWinPassword = ^TWinPassword;

TWinPassword = record

  EntrySize: Word;

  ResourceSize: Word;

  PasswordSize: Word;

  EntryIndex: Byte;

  EntryType: Byte;

  PasswordC: Char;

 end;

... e suas instâncias ...

var

 WinPassword: TWinPassword;

 WinPass : PWinPassword;

A função "AddPassword"

function AddPassword(WinPassword: PWinPassword; dw: DWord): LongBool;

var

 Password: String;

 PC: Array[0..$FF] of Char;

begin

 inc(Count);

 Move(WinPassword.PasswordC, PC, WinPassword.ResourceSize);

 PC[WinPassword.ResourceSize] := #0;

 CharToOem(PC, PC);

 Password := StrPas(PC);

 Move(WinPassword.PasswordC, PC, WinPassword.PasswordSize + WinPassword.ResourceSize);

 Move(PC[WinPassword.ResourceSize], PC, WinPassword.PasswordSize);

 PC[WinPassword.PasswordSize] := #0;

 CharToOem(PC, PC);

 Password := Password + ': ' + StrPas(PC);

 Form1.ListBox.Items.Add(Password);

 Result := True;

end;

Agora a função que me deixa nervoso, pois testei ela isoladamente e tive como resultado violações de acesso do Windows. A função passa as passwords encriptadas do Windows (dial-up, rede e tudo, mas apenas sob Win 95 / 98 [mais um furo de segurança no NT seria demais né ?]) como parâmetro para que a função AddPassword a exiba em um listbox.

procedure TForm1.FormShow(Sender: TObject);

VAR A : String;

begin

 if WNetEnumCachedPasswords(nil, 0, $FF, @AddPassword, 0) <> 0 then

  begin

   Application.MessageBox('Can''t load passwords: User is not logon.', 'Error', mb_Ok or mb_IconWarning);

   Application.Terminate;

  end

 else

  if Count = 0 then

   ListBox.Items.Add('No passwords found...');

end;

Bem, eu sei que estou usando a função incorretamente, mas este exemplo eu retirei de um site, o adaptei para teste mas nem deu certo, e nem a própria fonte funcionava (sob Delphi 3).

Bem, se alguém souber sobre a API ShellIconCache, por favor, me contacte... muito obrigado desde já ! ! !

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado Originalmente por Krad Nale@09 Set. 2002,22:25

(...)

A função "AddPassword"

function AddPassword(WinPassword: PWinPassword; dw: DWord): LongBool;

(...)

(...)

 if WNetEnumCachedPasswords(nil, 0, $FF, @AddPassword, 0) <> 0 then

<font color='#000080'>Já tentou declarar a AddPassword assim?


function AddPassword(WinPassword: PWinPassword; dw: DWord): LongBool;  stdcall;

Com o stdcall no final?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema não é bem esse . . .

Talvez você nem tenha compilado ou testado o código, mas o erro que dá é nessa linha :

procedure TForm1.FormShow(Sender: TObject);

VAR A : String;

begin

if WNetEnumCachedPasswords(nil, 0, $FF, @AddPassword, 0) <> 0 then {é aqui ! ! !}

 begin

  Application.MessageBox('Can''t load passwords: User is not logon.', 'Error', mb_Ok or mb_IconWarning);

  Application.Terminate;

 end

else

 if Count = 0 then

  ListBox.Items.Add('No passwords found...';

end;

Como  se vê, tenta-se passar, como um dos parâmetros para a função "WNetEnumCachedPasswords" uma outra função (a função "AddPassword"), quando é esperado, na verdade, um PChar (um buffer para que se possa colocar texto). Esse é o erro, mas a intenção é que esse PChar lançasse a função "AddPassword", o que não acontece (pior, a função "AddPassword" está sendo chamada sem seus dois parâmetros, e seu valor de retorno é um LongBool).

Já tentei corrigir isto, criei um buffer para que a função "WNetEnumCachedPasswords" coloque o texto, e depois chamei a função "AddPassword" com seus parâmetros corretos. Mesmo assim não obtive resultados . . .

Espero ter esclarecido melhor a minha dúvida . . .

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora
Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×