Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Zjištění MAC adresy v Pascal/assembler/DOS programu pod XP

Až do Windows98SE mi bez problémů fungovala funkce MS-DOS EEh, která vrací MAC adresu síťové karty. Pod XP mi to ale hází nějaký hausnumero.
Zřejmě Xp už nepodporují "staré" MS-DOS služby.
Poradíte někdo jestli existuje něco takového i pod XP? Zatím Googluju bezúspěchu :-(

PROCEDURE GetNode( var hex_addr: string; var retcode: integer );
{ get the physical station address }

Const
   Hex_Set  :packed array[0..15] of char = '0123456789ABCDEF';

Begin { GetNode }
   {Get the physical address from the Network Card}
   Regs.Ah := $EE;
   regs.ds := 0;
   regs.es := 0;
   MsDos(Regs);
   hex_addr := '';
   hex_addr := hex_addr + hex_set[(regs.ch shr 4)];
   hex_addr := hex_addr + hex_set[(regs.ch and $0f)];
   hex_addr := hex_addr + hex_set[(regs.cl shr 4) ];
   hex_addr := hex_addr + hex_set[(regs.cl and $0f)];
   hex_addr := hex_addr + hex_set[(regs.bh shr 4)];
   hex_addr := hex_addr + hex_set[(regs.bh and $0f)];
   hex_addr := hex_addr + hex_set[(regs.bl shr 4)];
   hex_addr := hex_addr + hex_set[(regs.bl and $0f)];
   hex_addr := hex_addr + hex_set[(regs.ah shr 4)];
   hex_addr := hex_addr + hex_set[(regs.ah and $0f)];
   hex_addr := hex_addr + hex_set[(regs.al shr 4)];
   hex_addr := hex_addr + hex_set[(regs.al and $0f)];
   retcode := 0;
End; { Getnode }

Předmět Autor Datum
Ked nejdu DOS sluzby tak musis urobit Win32 aplikaciu (a nie 16bit DOS aplikaciu), t.j. musis pouzit…
MM.. 11.03.2009 17:39
MM..
Jednou z moznosti je spustit nejakou systemovou utilitku, tu presmerovat do souboru a vysledek pak z…
Jan Fiala 11.03.2009 17:51
Jan Fiala
Raději bych nerozumně zůstal u DOS aplikace. Zaráží mě, že všechny ostatní funkce (komunikace se ser…
JoDiK 12.03.2009 11:11
JoDiK
Už jsem něco o té službě našel. Zdá se, že jde o zjišťování MAC prostřednictvím Novell Netware (zřej…
JoDiK 12.03.2009 11:17
JoDiK
Uses Winsock; Function SendARP (DestIp: DWORD; srcIP: DWORD; pMacAddr: pointer; PhyAddrLen: Pointer)…
pme 11.03.2009 18:38
pme
Tohle je pokud tomu dobře rozumím zjišťování MAC adresy síťovky jiného počítače podle zadané IP. Já…
JoDiK 12.03.2009 11:30
JoDiK
Tak hlásím, že problém je vyřešen, použil jsem jinou službu: E3h, která funguje i pod XP. Vlastně ob… poslední
JoDiK 12.03.2009 12:44
JoDiK

Ked nejdu DOS sluzby tak musis urobit Win32 aplikaciu (a nie 16bit DOS aplikaciu), t.j. musis pouzit iny prekladac (napr. visual studio express je zdarma, google). Mozes urobit konzolovu Win32 aplikaciu, ta sa sprava z hladiska pouzivatela vpodstate ako DOS aplikacia.

A pouzijes napr. WinAPI funkciu GetAdaptersInfo
http://msdn.microsoft.com/en-us/library/aa365917(V S.85).aspx
mas tam aj zdrojak prikladu, ten priklad je kompletny zdrojak konzolovej aplikacie.

P.S. aj Win32 aplikacie sa daju robit v pascali (delphi) alebo aj v assembleri (napr. vo VC++ cez _asm apod).

Raději bych nerozumně zůstal u DOS aplikace.
Zaráží mě, že všechny ostatní funkce (komunikace se serverem Novell jako zjišťování jména uživatele, zařazení do skupin, datum a čas přihlášení) touto službou (vlastně sw přerušení 21h) fungují pořád.
Nemůžu ale najít popis té služby EEh (většinou seznamy končí někde u 57h), možná se pod XP musí jen něco upřesnit, nevím třeba už nemají implicitní síťovou kartu nebo tak.

Uses Winsock;

Function SendARP (DestIp: DWORD; srcIP: DWORD; pMacAddr: pointer; PhyAddrLen: Pointer): DWORD;stdcall; external 'iphlpapi.dll';

Function getRemoteMacAdress (var address: String): Boolean;
var
  dwRemoteIP: DWORD;
  PhyAddrLen: Longword;
  pMacAddr : array [0..1] of Longword;
  temp: array [0..5] of byte;
  I: Byte;
begin
  Result := false;
  dwremoteIP := inet_addr (@address[1]);
  if dwremoteIP <> 0 then begin
    PhyAddrLen := 6;
    if SendARP (dwremoteIP, 0, @pMacAddr, @PhyAddrLen) = NO_ERROR then begin
      if (PhyAddrLen <> 0) and (pMacAddr[0] <> 0) then begin
         Move (pMacAddr, temp, 6);
         address := '';
         For I := 0 to 5 do address := address + inttohex (temp[i], 2)+'-';
         Delete (address, Length (address), 1);
         Result := true;
      end;
    end;
  end;
end;

Funguje pod Vista, preložené v Delphi2007 ;-)

Zpět do poradny Odpovědět na původní otázku Nahoru