Как диагностировать ошибку Access Denied из Windows ICMP.DLL - PullRequest
0 голосов
/ 19 сентября 2019

В моем приложении Delphi я звоню IcmpSendEcho() с icmp.dll.Код работал хорошо в течение многих лет и для нескольких пользователей на разных платформах.Тем не менее, у меня есть один пользователь, который возвращает вызов Отказано в доступе.

Я запустил Process Monitor, но там ничего не видно.Я проверил все очевидные права доступа, я даже использовал браузер DLL, чтобы убедиться, что их DLL содержит соответствующую функцию экспорта (браузер DLL не имеет проблем с доступом к DLL) !!

Я собралавтономное тестовое приложение для этого клиента, код ниже:

function TForm40.PingDiagnose(InetAddress: string): boolean;
var
  IPAddress: string;
  Handle: THandle;
  InAddr: IPAddr;
  DW: DWORD;
  rep: array [1 .. 1280] of byte;//try a stupid size in case that's the problem
begin
  result := false;
  Memo1.lines.add('Attempting to get handle on icmp.dll');
  Handle := IcmpCreateFile;
  if Handle = INVALID_HANDLE_VALUE then
  begin
    Memo1.lines.add('Failed to get handle on icmp.dll');
    Exit;
  end;
  try
    IPAddress := '';
    Memo1.lines.add(format('Attempting to resolve IP address for %s',[InetAddress]));
    IPAddress := GetIPAddress(InetAddress);
    Memo1.lines.add(format('IP address returned %s',[IPAddress]));
    if (IPAddress <> '') then  // if internet is down, IPAddress could be an empty string
    begin
      with TIdStackWindows.create do
      begin
        TranslateStringToTInAddr(IPAddress, InAddr, Id_IPv4);
        free;
      end;
      Memo1.lines.add('Attempting to call IcmpSendEcho on icmp.dll');
      DW := IcmpSendEcho(Handle, InAddr, nil, 0, nil, @rep, 1280, 1000);
      Memo1.lines.add(format('Result returned from call: %d',[DW]));
      if DW=0 then
      begin
        Memo1.lines.add(format('Error number: %d - %s',[GetLastError, SysErrorMessage(GetLastError)]));
      end;
      result := (DW <> 0);
    end;
  finally
    IcmpCloseHandle(Handle);
  end;
end;

Поэтому я предполагаю, что именно то, что IcmpSendEcho() делает дальше, вызывает ошибку.

Я не могу найти ничего полезного через Google, поэтому есть какие-либо идеи относительно того, что может происходить, или как я могу "отладить" это дальше?

...