Ir ao conteúdo
  • Cadastre-se

Uso de api´s no delphi / c


Krad Nale

Posts recomendados

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.

Link para o comentário
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 ! ! !

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).

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

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á ! ! !

Link para o comentário
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

Já tentou declarar a AddPassword assim?


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

Com o stdcall no final?

Link para o comentário
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 . . .

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...