Win32 API FAQ
Страница 19.


 

    Вариант2:


#include
#include
#include
#include
#include

void main()
{
int iAdapters,iOpt=sizeof(iAdapters),iSize=sizeof(SOCKADDR_IPX);
SOCKET skNum;
SOCKADDR_IPX Addr;
WSADATA Wsa;

if(WSAStartup(0x0101,&Wsa)) return;
if
((skNum=socket(AF_IPX,SOCK_DGRAM,
NSPROTO_IPX))!=INVALID_SOCKET)
      {
      memset(&Addr,0,sizeof(Addr));
      Addr.sa_family=AF_IPX;
      if(bind(skNum,(SOCKADDR *)&Addr,iSize)!=SOCKET_ERROR)
         {
         if(getsockopt(skNum,NSPROTO_IPX,IPX_MAX_ADAPTER_NUM,
                       (char *)&iAdapters,&iOpt)!=SOCKET_ERROR)
            {
            while(iAdapters)
               {
               IPX_ADDRESS_DATA Data;
               memset(&Data,0,sizeof(Data));
               Data.adapternum=iAdapters-1;
               iOpt=sizeof(Data);
               if(getsockopt(skNum,NSPROTO_IPX,IPX_ADDRESS,(char
*)&Data,&iOpt)!=SOCKET_ERROR)
                  {
                  printf("Addr: %02X%02X%02X%02X:%02X%02X%02X%02X%02X%02X\n",
                  (int)Data.netnum[0],(int)Data.netnum[1],(int)Data.netnum[2],
                  (int)Data.netnum[3],(int)Data.netnum[4],(int)Data.netnum[5],
                  (int)Data.netnum[6],(int)Data.netnum[7],(int)Data.netnum[8],
                  (int)Data.netnum[9]);
                  }
               iAdapters--;
               }
            }
         }
      closesocket(skNum);
      }
WSACleanup();
}

    Вариант3:

    From: MSDN

      #include
      #include
      #include
      #include
      #include

      typedef struct _ASTAT_
      {
         ADAPTER_STATUS adapt;
         NAME_BUFFER NameBuff [30];
      }ASTAT, * PASTAT;

      ASTAT Adapter;

      void main (void)
      {
         NCB Ncb;
         UCHAR uRetCode;
         char NetName[50];

         memset( &Ncb, 0, sizeof(Ncb) );
         Ncb.ncb_command = NCBRESET;
         Ncb.ncb_lana_num = 0;

         uRetCode = Netbios( &Ncb );
         printf( "The NCBRESET return code is: 0x%x \n", uRetCode );

         memset( &Ncb, 0, sizeof (Ncb) );
         Ncb.ncb_command = NCBASTAT;
         Ncb.ncb_lana_num = 0;

         strcpy( Ncb.ncb_callname, "* " );
         Ncb.ncb_buffer = (char *) &Adapter;
         Ncb.ncb_length = sizeof(Adapter);

         uRetCode = Netbios( &Ncb );
         printf( "The NCBASTAT return code is: 0x%x \n", uRetCode );
         if ( uRetCode == 0 )
         {
            printf( "The Ethernet Number is: %02x%02x%02x%02x%02x%02x\n",
                     Adapter.adapt.adapter_address[0],
                     Adapter.adapt.adapter_address[1],
                     Adapter.adapt.adapter_address[2],
                     Adapter.adapt.adapter_address[3],
                     Adapter.adapt.adapter_address[4],
                     Adapter.adapt.adapter_address[5] );
         }
      }

43)----------------------------------------------------------------------------

Q> Как сделать, чтобы мою прогу нельзя было бы убить?

A> Я не пробовал,но imho от End Task это не спасет

    From : Dmitry V. Liseev

Делать неубиваемый процесс очень просто.
Перед тем, как убить винда сначала попытается завершить
его по-хорошему. Тут он и должен запустить свою копию
и передать ей все нужные данные перед благополучным
завершением.

LRESULT WINAPI WndProc(HWND hWnd, UINT msg,
        WPARAM wParam, LPARAM lParam)
{
     switch(msg)
     {
        //HANDLE_MSG(hWnd, WM_CREATE, WndProc_OnCreate);
        HANDLE_MSG(hWnd, WM_DESTROY, WndProc_OnDestroy);
        //HANDLE_MSG(hWnd, WM_SIZE, WndProc_OnSize);
        //HANDLE_MSG(hWnd, WM_COMMAND, WndProc_OnCommand);
        default:
           return DefWindowProc(hWnd, msg, wParam, lParam);
     }
}

void WndProc_OnDestroy(HWND hWnd)
{
     STARTUPINFO si;
     PROCESS_INFORMATION pi;

     // Создадим другой процесс, а этот благополучно завершим.
     memset(&si, 0, sizeof(STARTUPINFO));
     si.cb = sizeof(STARTUPINFO);
     CreateProcess(NULL, "program.exe", NULL, NULL,
         FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, π);
     CloseHandle(pi.hThread);
     CloseHandle(pi.hProcess);
     PostQuitMessage(0);
     //return FORWARD_WM_DESTROY(hWnd, DefWindowProc);
}

 
« Предыдущая статья   Следующая статья »