Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 8 мая!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Слушай, дружище, зачем так мучиться с этим языком С++, ты ведь не Билл Гейтс. Возьми тот же Python и программируй, он кроссплатформенный, под Windows тоже работает. Я сам давно заметил: то что на Си пишешь в страницу кода, на питоне решается в одну-две строки. При том, питон намного проще, я его сам недавно изучил по видеокурсу вот этому. Кстати, автор отлично там объясняет. Буквально день-два и уже будешь писать на нём, чего не скажешь про сложный С++.
 
 
 
               Win32 API FAQ (C)1999-2000 Serge Andyk (Сергей Андык)
 
                                 2:5005/58.43
 
                              <a href="mailto:asvzzz@netcity.ru">asvzzz@netcity.ru</a>
 
 
 
 
 
         Если Вы хотите что-то добавить, а тем более обнаpyжили ошибкy (в том
 
  чиcле оpфогpафическyю/синтаксичекyю, то обязательно напишите мне по  адpесy
 
  2:5005/58.43 или <a href="mailto:asvzzz@netcity.ru">asvzzz@netcity.ru</a>
 
 
 
  Версия 3.2, * отмечены новые, измененные или исправленные ответы
 
 
 
  Нижеприведенные программы,функции,фишки и трюки найдены мной в
 
  самых различных местах и конференциях. Линки смотреть в конце фака.
 
 
 
  Практически все опробовано под MSVC4.2 и WindowsNT4.0+SP4+IE4.
 
 
 
   1)  Как определить,принадлежит ли юзер группе администраторов?
 
   2)  Как узнать какие привилегии есть у пользователя ?
 
   3)  Как узнать SID юзера?
 
   4)  Как SID привести к текстовому виду(например для загрузки HKEY_USERS)?
 
   5)  Как дать (забрать) привилегии?
 
   6)  А как для вышеприведенного фрагмента получить хэндл полиси???
 
   7)  Как взять себе привилегию?
 
   8)  Как включить/выключить аудит?
 
   9)  Как грохнуть процесс(в том числе системный)?
 
   10) Как поставить system-wide хук(например писать в файл все нажатия кнопок)
 
   11) Как зашутдаунить удаленный компьютер?
 
   12) Как сделать чтобы окошко не появлялось на таскбаре?
 
   13) Как запустить(придушить) скринсэйвер
 
   14) Как узнать ip адрес(а) машины (в текстовом виде)?
 
   15) Как определить тип Windows на компьютере?
 
   16) Как подключить сетевой диск?
 
   17) А как его отключить?
 
   18) Как послать сообщение юзеру(а-ля net send или winpopup)
 
   19) Как создать юзера и дать ему права?
 
   20) Как узнать какие пользователи есть на моей (или не моей) машине?
 
   21) Кто по сети или локально шарится по моей(не моей)машине?
 
   22) Как в мультипроцессорной системе указать задаче на каком процессоре рабо
 
       тать
 
   23) Как установить (узнать) приоритет процесса?
 
   24) Как установить (узнать) приоритет нити?
 
   25) Как определить тип NT - server или workstation?
 
   26) Как проследить чтобы только одна копия приложения работала в данный момент
 
   27) Имеется PID процесса,как узнать имя &quot;process executable&quot;?
 
   28) Как извлечь версию EXE,DLL и т.д.?
 
   29) Как узнать имя дефолтового web browsera и , вообще, как узнать
 
       - с какой  программой ассоциирован данный тип файла (напр .HTM или .ZIP)?
 
   30) Как удалить директорию,если она не пустая?
 
   31) Как запретить переключение по alt-tab?
 
   32) Как программно нажать клавишу (Num Lock например)?
 
   33) Как соединиться по RAS ?
 
   34) Как определить,имеется ли соединение по RAS?
 
   35) Как разорвать соединение?
 
   36) Как узнать максимум информации о типе и возможностях ОС,
 
       установленной на удаленной машине?
 
   37) Как создать hard link на NTFS?
 
   38) Как &quot;зашедулить&quot; задачу ?
 
   39) Как посмотреть,что же там уже &quot;нашедулено&quot;?
 
   40) Можно ли в 95 использовать функции Net*() (NetFileEnum и т.п.)?
 
   41) Как определить частоту процессора?
 
   42) Как узнать MAC адрес сетевой карты?
 
   43) Как сделать, чтобы мою прогу нельзя было бы убить?
 
   44) Как узнать хэндл консольного окна?
 
   45) Как активизировать любое окно(передать ему фокус ввода)?
 
   46) Как стереть самого себя?
 
   47) Как поменять default принтер?
 
   48) Как проверить, есть ли дискета в дисководе?
 
   49) Как послать пинг?
 
   50) Как программно поменять IP адрес? А HostName?
 
   51) Как программно нажать кнопку &quot;Start&quot; ?
 
   52) Как убрать таскбар?
 
   53) Как в GUI приложении открыть консоль и назначить stdin,stdout,stderr?
 
   54) Как,зная имя и пароль пользователя и не имея привилегий для LogonUser(),
 
       программно проверить их на правильность?
 
   55) Как динамически прятать/показывать кнопку на таскбаре?
 
   56) Как обрабатывать сообщения от колеса MS Intellimouse?
 
 * 57) Как сделать кусок окна (например, прямоугольный) &quot;прозрачным&quot;?
 
 * 58) Есть ли в способ поместить кнопкy pядом с системными в веpхнем пpавом
 
       yглy, или это нyжно делать pyками?
 
 * 59) Как узнать время старта системы (uptime)?
 
 * 60) Как переключить консоль в полный экран и обратно?
 
 
 
 Links
 
 
 
 1)----------------------------------------------------------------------------
 
 
 
  Q&gt; Как определить,принадлежит ли юзер группе администраторов?
 
  A&gt; Два метода в одном флаконе:
 
 
 
 #include &lt;windows.h&gt;
 
 #include &lt;stdio.h&gt;
 
 #include &lt;lm.h&gt;
 
 #pragma hdrstop
 
 
 
 #pragma comment( lib, &quot;netapi32.lib&quot; )
 
 
 
 // My thanks to Jerry Coffin (<a href="mailto:jcoffin@taeus.com">jcoffin@taeus.com</a>)
 
 // for this much simpler method.
 
 bool jerry_coffin_method()
 
 {
 
  bool result;
 
  DWORD rc;
 
  wchar_t user_name[256];
 
  USER_INFO_1 *info;
 
  DWORD size = sizeof( user_name );
 
 
 
  GetUserNameW( user_name, &amp;size);
 
 
 
  rc = NetUserGetInfo( NULL, user_name, 1, (byte **) &amp;info );
 
  if ( rc != NERR_Success )
 
   return false;
 
 
 
  result = info-&gt;usri1_priv == USER_PRIV_ADMIN;
 
 
 
  NetApiBufferFree( info );
 
  return result;
 
 }
 
 
 
 
 
 bool look_at_token_method()
 
 {
 
  int found;
 
  DWORD i, l;
 
  HANDLE hTok;
 
  PSID pAdminSid;
 
  SID_IDENTIFIER_AUTHORITY ntAuth = SECURITY_NT_AUTHORITY;
 
 
 
  byte rawGroupList[4096];
 
  TOKEN_GROUPS&amp; groupList = *( (TOKEN_GROUPS *) rawGroupList );
 
 
 
  if ( ! OpenThreadToken( GetCurrentThread(), TOKEN_QUERY, FALSE, &amp;hTok ) )
 
  {
 
   printf( &quot;Cannot open thread token, trying process token [%lu].\n&quot;,
 
    GetLastError() );
 
   if ( ! OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY, &amp;hTok ) )
 
   {
 
    printf( &quot;Cannot open process token, quitting [%lu].\n&quot;,
 
     GetLastError() );
 
    return 1;
 
   }
 
  }
 
 
 
  // normally, I should get the size of the group list first, but ...
 
  l = sizeof rawGroupList;
 
  if ( ! GetTokenInformation( hTok, TokenGroups, &amp;groupList, l, &amp;l ) )
 
  {
 
   printf( &quot;Cannot get group list from token [%lu].\n&quot;,
 
    GetLastError() );
 
   return 1;
 
  }
 
 
 
  // here, we cobble up a SID for the Administrators group, to compare to.
 
  if ( ! AllocateAndInitializeSid( &amp;ntAuth, 2, SECURITY_BUILTIN_DOMAIN_RID,
 
   DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &amp;pAdminSid ) )
 
  {
 
   printf( &quot;Cannot create SID for Administrators [%lu].\n&quot;,
 
    GetLastError() );
 
   return 1;
 
  }
 
 
 
  // now, loop through groups in token and compare
 
  found = 0;
 
  for ( i = 0; i &lt; groupList.GroupCount; ++ i )
 
  {
 
   if ( EqualSid( pAdminSid, groupList.Groups[i].Sid ) )
 
   {
 
    found = 1;
 
    break;
 
   }
 
  }
 
 
 
  FreeSid( pAdminSid );
 
  CloseHandle( hTok );
 
  return !!found;
 
 }
 
 
 
 int main()
 
 {
 
  bool j, l;
 
 
 
  j = jerry_coffin_method();
 
  l = look_at_token_method();
 
 
 
  printf( &quot;NetUserGetInfo(): The current user is %san Administrator.\n&quot;,
 
   j? &quot;&quot;: &quot;not &quot; );
 
  printf( &quot;Process token: The current user is %sa member of the Administrators
 
 group.\n&quot;,
 
   l? &quot;&quot;: &quot;not &quot; );
 
 
 
  return 0;
 
 }
 
 
 
 
 
 2)----------------------------------------------------------------------------
 
 
 
  Q&gt; Как узнать какие привилегии есть у пользователя ?
 
  A&gt;
 
 
 
 #include &lt;windows.h&gt;
 
 #include &lt;stdio.h&gt;
 
 #pragma hdrstop
 
 
 
 void main()
 
 {
 
  HANDLE hToken;
 
  LUID setcbnameValue;
 
  TOKEN_PRIVILEGES tkp;
 
  DWORD errcod;
 
  LPVOID lpMsgBuf;
 
  LPCTSTR msgptr;
 
 
 
  UCHAR InfoBuffer[1000];
 
  PTOKEN_PRIVILEGES ptgPrivileges = (PTOKEN_PRIVILEGES) InfoBuffer;
 
  DWORD dwInfoBufferSize;
 
  DWORD dwPrivilegeNameSize;
 
  DWORD dwDisplayNameSize;
 
  UCHAR ucPrivilegeName[500];
 
  UCHAR ucDisplayName[500];
 
  DWORD dwLangId;
 
  UINT i;
 
 
 
  if ( ! OpenProcessToken( GetCurrentProcess(),
 
   TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &amp;hToken ) )
 
  {
 
   puts( &quot;OpenProcessToken&quot; );
 
   return;
 
  }
 
 
 
  // ---------------------------------------------------------------------
 
  // enumerate currently held privs (NOTE: not *enabled* privs, just the
 
  // ones you _could_ enable as in the last part)
 
 
 
  GetTokenInformation( hToken, TokenPrivileges, InfoBuffer,
 
   sizeof InfoBuffer, &amp;dwInfoBufferSize);
 
 
 
  printf( &quot;Account privileges: \n\n&quot; );
 
  for( i = 0; i &lt; ptgPrivileges-&gt;PrivilegeCount; i ++ )
 
  {
 
   dwPrivilegeNameSize = sizeof ucPrivilegeName;
 
   dwDisplayNameSize = sizeof ucDisplayName;
 
   LookupPrivilegeName( NULL, &amp;ptgPrivileges-&gt;Privileges[i].Luid,
 
    ucPrivilegeName, &amp;dwPrivilegeNameSize );
 
   LookupPrivilegeDisplayName( NULL, ucPrivilegeName,
 
    ucDisplayName, &amp;dwDisplayNameSize, &amp;dwLangId );
 
   printf( &quot;%40s (%s)\n&quot;, ucDisplayName, ucPrivilegeName );
 
  }
 
 
 
 }
 
 
 
 3)----------------------------------------------------------------------------
 
 
 
  Q&gt; Как узнать SID юзера?
 
  A&gt; Из исходника getadmin:
 
 
 
 BOOL
 
 GetAccountSid(
 
     LPTSTR SystemName,
 
     LPTSTR AccountName,
 
     PSID *Sid
 
     )
 
 {
 
     LPTSTR ReferencedDomain=NULL;
 
     DWORD cbSid=128;    // initial allocation attempt
 
     DWORD cbReferencedDomain=16; // initial allocation size
 
     SID_NAME_USE peUse;
 
     BOOL bSuccess=FALSE; // assume this function will fail
 
 
 
     __try {
 
 
 
     //
 
     // initial memory allocations
 
     //
 
     if((*Sid=HeapAlloc(
 
                     GetProcessHeap(),
 
                     0,
 
                     cbSid
 
                     )) == NULL) __leave;
 
 
 
     if((ReferencedDomain=(LPTSTR)HeapAlloc(
 
                     GetProcessHeap(),
 
                     0,
 
                     cbReferencedDomain
 
                     )) == NULL) __leave;
 
 
 
     //
 
     // Obtain the SID of the specified account on the specified system.
 
     //
 
     while(!LookupAccountName(
 
                     SystemName,         // machine to lookup account on
 
                     AccountName,        // account to lookup
 
                     *Sid,               // SID of interest
 
                     &amp;cbSid,             // size of SID
 
                     ReferencedDomain,   // domain account was found on
 
                     &amp;cbReferencedDomain,
 
                     &amp;peUse
 
                     )) {
 
         if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
 
             //
 
             // reallocate memory
 
             //
 
             if((*Sid=HeapReAlloc(
 
                         GetProcessHeap(),
 
                         0,
 
                         *Sid,
 
                         cbSid
 
                         )) == NULL) __leave;
 
 
 
             if((ReferencedDomain=(LPTSTR)HeapReAlloc(
 
                         GetProcessHeap(),
 
                         0,
 
                         ReferencedDomain,
 
                         cbReferencedDomain
 
                         )) == NULL) __leave;
 
         }
 
         else __leave;
 
     }
 
 
 
     //
 
     // Indicate success.
 
     //
 
     bSuccess=TRUE;
 
 
 
     } // finally
 
     __finally {
 
 
 
     //
 
     // Cleanup and indicate failure, if appropriate.
 
     //
 
 
 
     HeapFree(GetProcessHeap(), 0, ReferencedDomain);
 
 
 
     if(!bSuccess) {
 
         if(*Sid != NULL) {
 
             HeapFree(GetProcessHeap(), 0, *Sid);
 
             *Sid = NULL;
 
         }
 
     }
 
 
 
     } // finally
 
 
 
     return bSuccess;
 
 }
 
 
 
 4)----------------------------------------------------------------------------
 
 
 
  Q&gt; Как SID привести к текстовому виду(например для загрузки HKEY_USERS)?
 
  A&gt; См.исходник:
 
 
 
 // nearly straight from the SDK
 
 BOOL Sid2Text( PSID ps, char *buf, int bufSize )
 
 {
 
  PSID_IDENTIFIER_AUTHORITY psia;
 
  DWORD dwSubAuthorities;
 
  DWORD dwSidRev = SID_REVISION;
 
  DWORD i;
 
  int n, size;
 
  char *p;
 
 
 
  // Validate the binary SID.
 
 
 
  if ( ! IsValidSid( ps ) )
 
   return FALSE;
 
 
 
  // Get the identifier authority value from the SID.
 
 
 
  psia = GetSidIdentifierAuthority( ps );
 
 
 
  // Get the number of subauthorities in the SID.
 
 
 
  dwSubAuthorities = *GetSidSubAuthorityCount( ps );
 
 
 
  // Compute the buffer length.
 
  // S-SID_REVISION- + IdentifierAuthority- + subauthorities- + NULL
 
 
 
  size = 15 + 12 + ( 12 * dwSubAuthorities ) + 1;
 
 
 
  // Check input buffer length.
 
  // If too small, indicate the proper size and set last error.
 
 
 
  if ( bufSize &lt; size )
 
  {
 
   SetLastError( ERROR_INSUFFICIENT_BUFFER );
 
   return FALSE;
 
  }
 
 
 
  // Add 'S' prefix and revision number to the string.
 
 
 
  size = wsprintf( buf, &quot;S-%lu-&quot;, dwSidRev );
 
  p = buf + size;
 
 
 
  // Add SID identifier authority to the string.
 
 
 
  if ( psia-&gt;Value[0] != 0 || psia-&gt;Value[1] != 0 )
 
  {
 
   n = wsprintf( p, &quot;0x%02hx%02hx%02hx%02hx%02hx%02hx&quot;,
 
   (USHORT) psia-&gt;Value[0], (USHORT) psia-&gt;Value[1],
 
   (USHORT) psia-&gt;Value[2], (USHORT) psia-&gt;Value[3],
 
   (USHORT) psia-&gt;Value[4], (USHORT) psia-&gt;Value[5] );
 
   size += n;
 
   p += n;
 
  }
 
  else
 
  {
 
   n = wsprintf( p, &quot;%lu&quot;, ( (ULONG) psia-&gt;Value[5] ) +
 
   ( (ULONG) psia-&gt;Value[4] &lt;&lt; 8 ) + ( (ULONG) psia-&gt;Value[3] &lt;&lt; 16 ) +
 
   ( (ULONG) psia-&gt;Value[2] &lt;&lt; 24 ) );
 
   size += n;
 
   p += n;
 
  }
 
 
 
  // Add SID subauthorities to the string.
 
 
 
  for ( i = 0; i &lt; dwSubAuthorities; ++ i )
 
  {
 
   n = wsprintf( p, &quot;-%lu&quot;, *GetSidSubAuthority( ps, i ) );
 
   size += n;
 
   p += n;
 
  }
 
 
 
  return TRUE;
 
 }
 
 
 
 5)----------------------------------------------------------------------------
 
 
 
  Q&gt; Как дать(забрать)привилегии?
 
  A&gt; (c)&quot;Getadmin&quot;
 
 
 
 #include &lt;ntsecapi.h&gt;
 
 #include &lt;lmaccess.h&gt;
 
 
 
 
 
 NTSTATUS
 
 SetPrivilegeOnAccount(
 
     LSA_HANDLE PolicyHandle,    // open policy handle
 
     PSID AccountSid,            // SID to grant privilege to
 
     LPWSTR PrivilegeName,       // privilege to grant (Unicode)
 
     BOOL bEnable                // enable or disable
 
     )
 
 {
 
     LSA_UNICODE_STRING PrivilegeString;
 
 
 
     //
 
     // Create a LSA_UNICODE_STRING for the privilege name.
 
     //
 
     InitLsaString(&amp;PrivilegeString, PrivilegeName);//см.ниже
 
 
 
     //
 
     // grant or revoke the privilege, accordingly
 
     //
 
     if(bEnable) {
 
         return LsaAddAccountRights(
 
                 PolicyHandle,       // open policy handle
 
                 AccountSid,         // target SID
 
                 &amp;PrivilegeString,   // privileges
 
                 1                   // privilege count
 
                 );
 
     }
 
     else {
 
         return LsaRemoveAccountRights(
 
                 PolicyHandle,       // open policy handle
 
                 AccountSid,         // target SID
 
                 FALSE,              // do not disable all rights
 
                 &amp;PrivilegeString,   // privileges
 
                 1                   // privilege count
 
                 );
 
     }
 
 }
 
 
 
 6)----------------------------------------------------------------------------
 
 
 
  Q&gt;  А как для вышеприведенного фрагмента получить хэндл полиси???
 
  A&gt;
 
 
 
 #include &lt;ntsecapi.h&gt;
 
 #include &lt;lmaccess.h&gt;
 
 
 
 void
 
 InitLsaString(
 
     PLSA_UNICODE_STRING LsaString,
 
     LPWSTR String
 
     )
 
 {
 
     DWORD StringLength;
 
 
 
     if (String == NULL) {
 
         LsaString-&gt;Buffer = NULL;
 
         LsaString-&gt;Length = 0;
 
         LsaString-&gt;MaximumLength = 0;
 
         return;
 
     }
 
 
 
     StringLength = wcslen(String);
 
     LsaString-&gt;Buffer = String;
 
     LsaString-&gt;Length = (USHORT) StringLength * sizeof(WCHAR);
 
     LsaString-&gt;MaximumLength=(USHORT)(StringLength+1) * sizeof(WCHAR);
 
 }
 
 //----------------------------------------------------------------------
 
 NTSTATUS
 
 OpenPolicy(
 
     LPWSTR ServerName,
 
     DWORD DesiredAccess,
 
     PLSA_HANDLE PolicyHandle
 
     )
 
 {
 
     LSA_OBJECT_ATTRIBUTES ObjectAttributes;
 
     LSA_UNICODE_STRING ServerString;
 
     PLSA_UNICODE_STRING Server = NULL;
 
 
 
     //
 
     // Always initialize the object attributes to all zeroes.
 
     //
 
     ZeroMemory(&amp;ObjectAttributes, sizeof(ObjectAttributes));
 
 
 
     if (ServerName != NULL) {
 
         //
 
         // Make a LSA_UNICODE_STRING out of the LPWSTR passed in
 
         //
 
         InitLsaString(&amp;ServerString, ServerName);
 
         Server = &amp;ServerString;
 
     }
 
 
 
     //
 
     // Attempt to open the policy.
 
     //
 
     return LsaOpenPolicy(
 
                 Server,
 
                 &amp;ObjectAttributes,
 
                 DesiredAccess,
 
                 PolicyHandle
 
                 );
 
 }
 
 
 
 7)---------------------------------------------------------------------------
 
 
 
  Q&gt; Как взять себе привилегию?
 
  A&gt; Например берем привилегию отладки программ:
 
 
 
 void getDebugPriv( void )
 
 {
 
  HANDLE hToken;
 
  LUID sedebugnameValue;
 
  TOKEN_PRIVILEGES tkp;
 
 
 
  if ( ! OpenProcessToken( GetCurrentProcess(),
 
   TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &amp;hToken ) )
 
   return;
 
 
 
  if ( !LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &amp;sedebugnameValue ) )
 
  {
 
   CloseHandle( hToken );
 
   return;
 
  }
 
 
 
  tkp.PrivilegeCount = 1;
 
  tkp.Privileges[0].Luid = sedebugnameValue;
 
  tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 
 
 
  AdjustTokenPrivileges( hToken, FALSE, &amp;tkp, sizeof tkp, NULL, NULL );
 
 
 
  CloseHandle( hToken );
 
 }
 
 
 
 8)----------------------------------------------------------------------------
 
 
 
  Q&gt; Как  включить/выключить аудит?
 
  A&gt;
 
 
 
 #include &lt;windows.h&gt;
 
 #include &lt;stdio.h&gt;
 
 #include &lt;ntsecapi.h&gt;
 
 #pragma hdrstop
 
 
 
 // This code was kindly provided by Marc Esipovich, <a href="mailto:marc@mucom.co.il">marc@mucom.co.il</a>.
 
 // The original filename was &quot;isauditon.c&quot;.
 
 // Modifications by felixk:
 
 //   IsAuditOn() now accepts a BOOL; if FALSE, the code will
 
 //   _not_ force the audit settings to ON.
 
 //   Changed return type to int, as it may return 0, 1, -1.
 
 //   Added a small main() to call IsAuditOn(FALSE).
 
 
 
 /*
 
 
 
   RETURNS: 1 if Auditing has been enabled, 0 if no action taken, -1 on error.
 
 
 
   COMMENT: Automatically enables all audit policy events.
 
 
 
   Values are, 0 for no log at all, 1 for success only, 2 for failure only,
 
   3 for both success and failure.
 
 
 
 typedef struct _POLICY_BUFFER {
 
   DWORD IsAuditEnabled;  // 1 = ON, 0 = OFF.
 
   PVOID pPolicies;   // pointer to the start policy struct.
 
 
 
   DWORD restart_shutdown_and_system;
 
   DWORD junk1;
 
   DWORD logon_and_logoff;
 
   DWORD junk2;
 
   DWORD file_and_object_access;
 
   DWORD junk3;
 
   DWORD use_of_user_rights;
 
   DWORD junk4;
 
   DWORD process_tracking;
 
   DWORD junk5;
 
   DWORD security_policy_changes;
 
   DWORD junk6;
 
   DWORD user_and_group_management;
 
   DWORD junk7;
 
 } POLICY_BUFFER, *PPOLICY_BUFFER;
 
 */
 
 
 
 int IsAuditOn( BOOL forceAuditOn )
 
 {
 
  int rc = 0;
 
  POLICY_ACCOUNT_DOMAIN_INFO *ppadi = NULL;
 
  SECURITY_QUALITY_OF_SERVICE sqos;
 
  LSA_OBJECT_ATTRIBUTES lsaOA;
 
  LSA_HANDLE polHandle;
 
 
 
  NTSTATUS nts;
 
 
 
 
 
  // fill the Quality Of Service struct.
 
  sqos.Length = sizeof(SECURITY_QUALITY_OF_SERVICE);
 
  sqos.ImpersonationLevel = SecurityImpersonation;
 
  sqos.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING;
 
  sqos.EffectiveOnly = FALSE;
 
 
 
  // fill the Object Attributes struct.
 
  lsaOA.Length = sizeof(LSA_OBJECT_ATTRIBUTES);
 
  lsaOA.RootDirectory = NULL;
 
  lsaOA.ObjectName = NULL;
 
  lsaOA.Attributes = 0;
 
  lsaOA.SecurityDescriptor = NULL;
 
  lsaOA.SecurityQualityOfService = &amp;sqos;
 
 
 
  nts = LsaOpenPolicy(
 
      NULL, // NULL = current machine.
 
      &amp;lsaOA,
 
      POLICY_VIEW_LOCAL_INFORMATION | GENERIC_READ | GENERIC_EXECUTE |
 
 POLICY_ALL_ACCESS,
 
      &amp;polHandle);
 
  if (nts != 0) return -1;
 
 
 
 
 
  nts = LsaQueryInformationPolicy(
 
        polHandle,
 
        PolicyAuditEventsInformation,
 
        &amp;ppadi);
 
  if (nts != 0) return -1;
 
 
 
  if ( forceAuditOn )
 
  {
 
   // set policies
 
   ppadi-&gt;DomainName.Buffer[0] = 3;  // restart_shutdown_and_system
 
   ppadi-&gt;DomainName.Buffer[2] = 3;  // logon_and_logoff
 
   ppadi-&gt;DomainName.Buffer[4] = 3;  // file_and_object_access
 
   ppadi-&gt;DomainName.Buffer[6] = 3;  // use_of_user_rights
 
   ppadi-&gt;DomainName.Buffer[8]  = 3; // process_tracking
 
   ppadi-&gt;DomainName.Buffer[10] = 3; // security_policy_changes
 
   ppadi-&gt;DomainName.Buffer[12] = 3; // user_and_group_management
 
 
 
   ppadi-&gt;DomainName.Length = 1;
 
 
 
   nts = LsaSetInformationPolicy(
 
         polHandle,
 
         PolicyAuditEventsInformation,
 
         ppadi);
 
   if (nts != 0) return -1;
 
   rc = 1;
 
  }
 
 
 
  LsaFreeMemory(polHandle);
 
 
 
   return rc;
 
 }
 
 
 
 
 
 int main( void )
 
 {
 
  int rc;
 
 
 
  rc = IsAuditOn( FALSE );
 
 
 
  if ( rc == 1 )
 
   puts( &quot;Auditing has been enabled.&quot; );
 
  else if ( rc == 0 )
 
   puts( &quot;The audit state is unchanged.&quot; );
 
  else
 
   puts( &quot;Oops!&quot; );
 
 
 
  return 0;
 
 }
 
 
 
 9)---------------------------------------------------------------------------
 
 
 
  Q&gt; Как грохнуть процесс(в том числе системный)?
 
  A&gt;
 
 
 
 #include &lt;windows.h&gt;
 
 #include &lt;stdio.h&gt;
 
 #pragma hdrstop
 
 
 
 // fkill forces a kill -- it will attempt to enable SeDebugPrivilege
 
 // before opening its process handles, allowing it to kill processes
 
 // running under builtin\system (LocalSystem, to the users out there).
 
 
 
 int main( int argc, char *argv[] );
 
 void getDebugPriv( void );
 
 
 
 #define isBadHandle(h) ( (h) == NULL || (h) == INVALID_HANDLE_VALUE )
 
 #define lenof(x) ( sizeof (x) / sizeof ((x)[0]) )
 
 
 
 const int MAXPID = 1024;
 
 
 
 int main( int argc, char *argv[] )
 
 {
 
  int pidCount, i, errors;
 
  char *p;
 
  HANDLE hProcess;
 
  static DWORD pid[MAXPID];
 
 
 
  // parse args, build PID list
 
  errors = pidCount = 0;
 
 
 
  for ( i = 1; i &lt; argc; i ++ )
 
  {
 
   if ( pidCount == lenof( pid ) ) {
 
    errors ++;
 
    break;
 
   }
 
 
 
   pid[pidCount] = strtol( argv[i], &amp;p, 0 );
 
   if ( p == argv[i] || *p )
 
    errors ++;
 
   else
 
    pidCount ++;
 
  }
 
 
 
  if ( errors || pidCount == 0 )
 
  {
 
   puts( &quot;Usage: fkill pid [...]&quot; );
 
   puts( &quot;fkill tries to kill the processes specified by the PIDs. If the&quot; );
 
   puts( &quot;user has debug privileges, fkill is able to kill system processes.&quot; );
 
   puts( &quot;PIDs may be decimal, octal (starts with 0), or hex (starts with 0x).&quot;
 
 );
 
   return MAXPID + 1;
 
  }
 
 
 
  // try to acquire SeDebugPrivilege
 
  getDebugPriv(); //см. faq выше
 
 
 
  errors = 0;
 
  // for each PID:
 
  for ( i = 0; i &lt; pidCount; i ++ )
 
  {
 
   printf( &quot;pid %lu: &quot;, pid[i] );
 
 
 
   // open process
 
   hProcess = OpenProcess( PROCESS_TERMINATE, FALSE, pid[i] );
 
   if ( isBadHandle( hProcess ) )
 
    printf( &quot;OpenProcess() failed, err = %lu\n&quot;, GetLastError() );
 
   else
 
   {
 
    // kill process
 
    if ( ! TerminateProcess( hProcess, (DWORD) -1 ) )
 
     printf( &quot;TerminateProcess() failed, err = %lu\n&quot;, GetLastError() );
 
    else
 
     puts( &quot;killed.&quot; );
 
 
 
    // close handle
 
    CloseHandle( hProcess );
 
   }
 
  }
 
 
 
  return 0;
 
 }
 
 
 
 10)---------------------------------------------------------------------------
 
 
 
  Q&gt; Как поставить system-wide хук(например писать в файл все нажатия кнопок)
 
  A&gt;
 
 
 
 Для этого хук должен жить в длл.
 
 
 
 текст DLL:
 
 
 
 BOOL kdown=false;
 
 HANDLE ghDLLInst = 0;   // Handle to the DLL's instance.
 
 char logname[MAX_PATH];
 
 char sysdir[MAX_PATH];
 
 DWORD NOfBytes;
 
 BOOL shift=false;
 
 HANDLE LFile;
 
 char buffer[20];
 
 
 
 BOOL WINAPI DllMain (HANDLE hModule, DWORD dwFunction, LPVOID lpNot)
 
 {
 
     ghDLLInst = hModule;
 
 
 
     switch (dwFunction)
 
     {
 
         case DLL_PROCESS_ATTACH:
 
    {
 
 
 
    GetSystemDirectory(
 
       sysdir,
 
    MAX_PATH
 
    );
 
 
 
    strcpy(logname,sysdir);
 
    strcat(logname,&quot;\\kbdkeys.txt&quot;);
 
 
 
    }
 
         case DLL_PROCESS_DETACH:
 
    {
 
    }
 
 
 
         default:
 
             break;
 
     }
 
     return TRUE;
 
 }
 
 //------------------------------------------------
 
  LRESULT  CALLBACK KeyboardProc(
 
      int code,  // hook code
 
      WPARAM wParam,     // virtual-key code
 
      LPARAM lParam      // keystroke-message information
 
    )
 
 {
 
 BYTE aa[4];
 
 memcpy(aa,&amp;lParam,4);
 
 kdown=!(aa[3]&amp;&amp;64);
 
 BYTE scancode=aa[2];
 
 BYTE ww[4];
 
 memcpy(ww,&amp;wParam,4);
 
 
 
 if (code&lt;0)return CallNextHookEx(NULL,code,wParam,lParam);
 
 
 
 if(kdown&amp;&amp;(wParam==VK_SHIFT))shift=true;
 
 
 
 if(!kdown&amp;&amp;(wParam==VK_SHIFT))shift=false;
 
 
 
 if (kdown&amp;&amp;(wParam!=VK_SHIFT))
 
 {
 
 sprintf( buffer ,&quot;%c&quot;,wParam );
 
 if(isalpha(ww[0])&amp;(!shift))wParam=wParam+32;
 
 sprintf( buffer ,&quot;%c&quot;,wParam );
 
 if(wParam==VK_RETURN)strcpy(buffer,&quot;\n&quot;);
 
 
 
    LFile=CreateFile(logname, GENERIC_READ|GENERIC_WRITE,FILE_SHARE_WRITE |
 
 FILE_SHARE_READ |
 
 FILE_SHARE_DELETE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
 
   OVERLAPPED ovlp;
 
   DWORD ffsze=GetFileSize(LFile,NULL);
 
   ovlp.OffsetHigh=0;
 
   ovlp.hEvent=NULL;
 
    ovlp.Offset=ffsze;
 
 
 
   WriteFile(LFile,buffer,strlen(buffer),&amp;NOfBytes,&amp;ovlp);
 
 
 
   CloseHandle(LFile);
 
 }
 
  return CallNextHookEx(NULL,code,wParam,lParam);
 
 }
 
 //----------------------------------------------------------------------//
 
 текст приложения:
 
 
 
 #include &lt;commdlg.h&gt;
 
 #include &lt;stdlib.h&gt;
 
 #include &lt;winnls.h&gt;
 
 
 
 int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
 
                      LPSTR lpCmdLine, int nCmdShow);
 
 
 
 //---------------------------------------------------------------------//
 
 BOOL
 
 SetHook(
 
     BOOL fSet
 
     )
 
 {
 
     static HHOOK hhkKbdHook = NULL;
 
     static HANDLE hmodHook;
 
 
 
     if (fSet)
 
     {
 
         if (!hmodHook)
 
         {
 
             if (!(hmodHook = LoadLibrary(&quot;kbdh.dll&quot;))) //вышеприведенная длл
 
             {
 
                 return FALSE;
 
             }
 
         }
 
 
 
         if (!hhkKbdHook)
 
         {
 
          if (!(hhkKbdHook =
 
   SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)
 
   GetProcAddress((HINSTANCE)hmodHook,&quot;KeyboardProc&quot;),(HINSTANCE)hmodHook,0)))
 
             {
 
                 return FALSE;
 
             }
 
         }
 
 
 
  }
 
     else
 
     {
 
         if (hhkKbdHook)
 
         {
 
             UnhookWindowsHookEx(hhkKbdHook);
 
             hhkKbdHook = NULL;
 
         }
 
 
 
     }
 
 
 
     return TRUE;
 
 }
 
 //--------------------------------------------------------------------//
 
 int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
 
                      LPSTR lpCmdLine, int nCmdShow)
 
 {
 
     if(!SetHook(true))MessageBox(NULL,&quot;zad&quot;,&quot;zad&quot;,MB_OK);
 
     MSG   msg;
 
 
 
   while (GetMessage (&amp;msg, NULL, 0, 0))
 
   {
 
         TranslateMessage (&amp;msg);
 
         DispatchMessage (&amp;msg);
 
   }
 
  return( 0 );
 
 }
 
 
 
 11)---------------------------------------------------------------------------
 
 
 
  Q&gt; Как зашутдаунить удаленный компьютер?
 
  A&gt;
 
 
 
 int main(int argc, char **argv)
 
 {
 
 HANDLE hToken;
 
 TOKEN_PRIVILEGES tkp;
 
 //-------------------
 
  char *name=&quot;&quot;;    // address of name of computer to shut down
 
  char *msg=&quot;&quot;;     //address of message to display in dialog box
 
  DWORD time=0;     // time to display dialog box
 
  bool force=true;  // force applications with unsaved changes flag
 
  bool reboot=true; //reboot flag
 
 //---------------------------------------------------------------------
 
 
 
     OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
 
 &amp;hToken);
 
 
 
     if(!LookupPrivilegeValue(name, SE_SHUTDOWN_NAME,&amp;tkp.Privileges[0].Luid)){
 
     printf (&quot;SE_SHUTDOWN_NAME Privilege облом \n&quot;);
 
     return 1 ;};
 
 
 
     tkp.PrivilegeCount =1;
 
     tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 
     AdjustTokenPrivileges(hToken, FALSE, &amp;tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
 
 
 
     if(!LookupPrivilegeValue(name,
 
 SE_REMOTE_SHUTDOWN_NAME,&amp;tkp.Privileges[0].Luid)){
 
     printf(&quot;SE_REMOTE_SHUTDOWN_NAME Privilege облом \n&quot;);
 
     return 2 ;};
 
 
 
     tkp.PrivilegeCount =1;
 
     tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 
     AdjustTokenPrivileges(hToken, FALSE, &amp;tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
 
 
 
     if (InitiateSystemShutdown(name,msg,time,force,reboot))
 
     printf(&quot;%s shutdown Ok\n&quot;,name);
 
     else printf(&quot;Can't shutdown %s \n&quot;,name);
 
 
 
  return 0;
 
 }
 
 
 
 12)----------------------------------------------------------------------------
 
 
 
  Q&gt; Как сделать чтобы окошко не появлялось на таскбаре?
 
  A&gt;
 
 
 
 There is more than one way to stop a window appearing on the taskbar.
 
 
 
 Rather than WS_EX_APPWINDOW, give your window the WS_EX_TOOLWINDOW extended
 
 style. Since toolbars don't appear on the taskbar, this will prevent it
 
 appearing there. Unfortunately, this has some rather negative repercussions
 
 on the appearance of your window : it gets a thin caption with smaller title,
 
 and loses its system menu. This is not acceptable to many people.
 
 
 
 Windows owned by an invisible window won't appear on the taskbar. &quot;Great&quot;,
 
 say you, &quot;but my app is dialog based, so what now Mr Smarty ?&quot;. Well, you can
 
 either recast your dialog app as an SDI with a hidden main window, and have
 
 that main window shown at startup, or you can create your own hidden window
 
 and set that as  your dialogs owner.
 
 
 
 13)---------------------------------------------------------------------------
 
 
 
  Q&gt; Как запустить(придушить) скринсэйвер
 
  A&gt;
 
 
 
 Starting
 
 The method for starting a screen saver is simple, but surprising. You post your
 
 own window a message ! Post yourself the WM_SYSCOMMAND message with the
 
 SC_SCREE
 
 NSAVE parameter :
 
 
 
    // Uses MFC CWnd::PostMessage
 
    PostMessage (WM_SYSCOMMAND, SC_SCREENSAVE);
 
 
 
 
 
 Stopping
 
 Stopping a screen saver is somewhat more complex. The Microsoft-documented
 
 way of doing this is to look for the special screen-saver desktop, enumerate
 
 all windows on that desktop, and close them, as follows:
 
 
 
    hdesk = OpenDesktop(TEXT(&quot;Screen-saver&quot;),
 
                        0,
 
                        FALSE,
 
                        DESKTOP_READOBJECTS | DESKTOP_WRITEOBJECTS);
 
    if (hdesk)
 
    {
 
       EnumDesktopWindows (hdesk, (WNDENUMPROC)KillScreenSaverFunc, 0);
 
       CloseDesktop (hdesk);
 
    }
 
    // ----------------------------------------------------------------
 
 
 
    BOOL CALLBACK KillScreenSaverFunc (HWND hwnd, LPARAM lParam)
 
    {
 
       PostMessage(hwnd, WM_CLOSE, 0, 0);
 
       return TRUE;
 
    }
 
 
 
 
 
 However, I can't recommend this approach. I have found when using this code,
 
 NT4 very occasionally seems to get confused and pass you back the normal
 
 desktop handle, in which case you end up trying to close all the normal
 
 application windows. Note, in MS' defence, that the code above for closing
 
 32 bit savers is derived from a sample that is only marked as valid for
 
 NT3.51 - there is no mention of NT4 in the sample. Unfortunately, there is
 
 also nothing to indicate that it doesn't work properly.
 
 
 
 I have subsequently performed some tests, and found that the stock screen
 
 savers supplied with NT4 will in any case get a hit on the window class search
 
 normally used for 16 bit savers (&quot;WindowsScreenSaverClass&quot;). I don't believe
 
 for a moment that the OpenGL savers (for example) are 16 bit, so maybe MS are
 
 supplying a saver window class that will give the necessary hit. So anyway, you
 
 can use this route :
 
 
 
    HWND hSaver = FindWindow (&quot;WindowsScreenSaverClass&quot;, NULL);
 
    if (hSaver)
 
       PostMessage (hSaver, WM_CLOSE, 0, 0);
 
 
 
 Yet another alternative is now available, which depends upon new functionality
 
 in SystemParametersInfo. This should be even more general :
 
 
 
    BOOL bSaver;
 
    if (::SystemParametersInfo (SPI_GETSCREENSAVEACTIVE,0,&amp;bSaver,0))
 
    {
 
       if (bSaver)
 
       {
 
          ::PostMessage (::GetForegroundWindow(), WM_CLOSE, 0L, 0L);
 
       }
 
    }
 
 
 
 So you can try that one as well. An embarassment of riches !
 
 
 
 14)--------------------------------------------------------------------------
 
 
 
  Q&gt; Как узнать ip адрес(а) машины (в текстовом виде)?
 
  A&gt; Кусок исходника от плугина к BackOrifice:
 
 
 
 //---------------------------------------------------
 
 void MachineIP(char *result)
 
 {
 
       WSADATA WSAData;
 
 
 
       WSAStartup(MAKEWORD(1,1), &amp;WSAData);
 
 
 
  char dot[6];
 
  int iResult;
 
  int i = 0;
 
  u_long *ppIpNO;
 
  u_long *pIpNO;
 
  HOSTENT FAR *lphostent;
 
  u_long ipHO;
 
  unsigned char binIp[4];
 
  int iterations = 0;
 
 
 
  //Get local host name and crudely validate
 
  char szHostName[100];
 
  *result = 0;
 
 
 
  iResult = gethostname(szHostName, sizeof(szHostName));
 
 // printf(&quot;%d %s&quot;,iResult,szHostName);
 
  if ((iResult != 0) || (lstrcmp(szHostName, &quot;&quot;)==0))
 
   return;
 
 
 
  //Lok up this host info via supplied name
 
  lphostent = gethostbyname(szHostName);
 
  if (lphostent == NULL)
 
   return;
 
  //Retreive first entry (might have multiple connects)
 
  do
 
  {
 
   iterations++;
 
   ppIpNO = (u_long *)lphostent-&gt;h_addr_list;
 
   if (ppIpNO+i == NULL)
 
    return;
 
   pIpNO = ((u_long *)*(ppIpNO+i));
 
   if (pIpNO == NULL)
 
    return;
 
 
 
  //convert back to host order, since SOCKADDR_IN expects that
 
   //MessageBox(NULL,&quot;z&quot;,&quot;x&quot;,MB_OK);
 
   ipHO = ntohl(*pIpNO);
 
 
 
   binIp[0] = (BYTE)((ipHO &amp; 0xff000000) &gt;&gt; 24);
 
   itoa(binIp[0], dot, 10);
 
   strcat(result,dot);
 
   binIp[1] = (BYTE)((ipHO &amp; 0x00ff0000) &gt;&gt; 16);
 
   itoa(binIp[1], dot, 10);
 
   strcat(result, &quot;.&quot;); strcat(result, dot);
 
   binIp[2] = (BYTE)((ipHO &amp; 0x0000ff00) &gt;&gt; 8);
 
   itoa(binIp[2], dot, 10);
 
   strcat(result, &quot;.&quot;); strcat(result, dot);
 
   binIp[3] = (BYTE)(ipHO &amp; 0x000000ff);
 
   itoa(binIp[3], dot, 10);
 
   strcat(result,&quot;.&quot;); strcat(result, dot);
 
   strcat(result,&quot;\r\n&quot;);
 
   i++;
 
  } while ((pIpNO != NULL) &amp;&amp; (iterations &lt; 6));
 
  WSACleanup();
 
       PostQuitMessage(0);
 
  return;
 
 }
 
 
 
 15)--------------------------------------------------------------------------
 
 
 
  Q&gt; Как определить тип Windows на компьютере?
 
  A&gt;
 
 
 
 bool OsTypeNT(void)
 
 {
 
         OSVERSIONINFO vi;
 
 
 
         vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
 
         GetVersionEx(&amp;vi);
 
         if (vi.dwPlatformId==VER_PLATFORM_WIN32_NT)
 
         return true;
 
 
 
         return false;
 
 }
 
 
 
 16)--------------------------------------------------------------------------
 
 
 
  Q&gt; Как подключить сетевой диск?
 
  A&gt;
 
 
 
 DWORD ConnectRemoteDrive(LPSTR ShareName,LPSTR LocalDrive)
 
 {
 
 NETRESOURCE nr;
 
 ZeroMemory(&amp;nr,sizeof(nr));
 
 
 
     nr.dwScope=RESOURCE_GLOBALNET;
 
     nr.dwType=RESOURCETYPE_DISK;//RESOURCETYPE_ANY;
 
     nr.dwDisplayType=RESOURCEDISPLAYTYPE_GENERIC;
 
     nr.dwUsage=RESOURCEUSAGE_CONNECTABLE;
 
     nr.lpLocalName=LocalDrive;
 
     nr.lpRemoteName=ShareName;
 
     nr.lpComment=&quot;&quot;;
 
     nr.lpProvider=NULL;
 
 
 
     return WNetAddConnection2(&amp;nr, // NETRESOURCE from enumeration
 
     (LPSTR) NULL,             // no password
 
     (LPSTR) NULL,             // logged-in user
 
     CONNECT_UPDATE_PROFILE);  // update profile with connect info
 
 
 
 }
 
 
 
 17)-------------------------------------------------------------------------
 
 
 
  Q&gt; А как его отключить?
 
  A&gt; WNetCancelConnection2(LPSTR LocalDrive,CONNECT_UPDATE_PROFILE,TRUE);
 
 
 
 
 
 18)-------------------------------------------------------------------------
 
 
 
  Q&gt; Как послать сообщение юзеру(а-ля net send)
 
  A&gt;
 
 
 
  Вариант 1:
 
 
 
  NET_API_STATUS x=NetMessageBufferSend(
 
                  LPTSTR servername,
 
          LPTSTR msgname,
 
          LPTSTR fromname,
 
          LPBYTE buf,
 
          DWORD buflen
 
            );
 
 
 
  Вариант 2:
 
 
 
 From: Alexandr Shandra entryway@astral.ntu-kpi.kiev.ua
 
 
 
 Можно через CreateFile/WriteFile, но в этом случае можно послать сообщение
 
 только компьютеру либо на локальную рабочую группу.
 
 
 
 Вот пример:(работает как под NT так и под 9x);
 
 
 
 HANDLE hSlot = CreateFile(&quot;\\\\computername\\mailslot\\messngr&quot;,
 
     GENERIC_WRITE, FILE_SHARE_READ, NULL,
 
     OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
 
 
 
 if (hSlot != INVALID_HANDLE_VALUE)
 
 {
 
    char buf = &quot;From\0\To\0Message\0&quot;;
 
    uint cb = sizeof(buf);
 
    WriteFile(hSlot, buf, cb, &amp;cb, NULL);
 
    CloseHandle(hSlot);
 
 }
 
 
 
 
 
 19)--------------------------------------------------------------------------
 
 
 
  Q&gt; Как создать юзера и дать ему права?
 
  A&gt;
 
 
 
 NET_API_STATUS UserAdd(LPSTR username) //(c) Serge Andyk
 
 {
 
 // некоторые используемые функции описаны выше
 
 
 
 USER_INFO_2   user_info;
 
 
 
 char compname[256];
 
 wchar_t wcompname[256];
 
 DWORD parm_err=0;
 
 LSA_HANDLE PolicyHandle;
 
 
 
 LPTSTR lpszSystemInfo;    // ptr. to system info. string
 
 DWORD cchBuff = 256;      // size of comp. or user name
 
 TCHAR tchBuffer2[256];    // buffer for concat'd. str.
 
 WCHAR wGroupNameAdd[20]=L&quot;Administrators&quot;;
 
 lpszSystemInfo = tchBuffer2;
 
 ZeroMemory(&amp;user_info,sizeof(user_info));
 
 
 
     GetComputerName(lpszSystemInfo, &amp;cchBuff);
 
     strcpy(compname,&quot;\\\\&quot;);
 
     strcat(compname,lpszSystemInfo);
 
 
 
     mbstowcs( wcompname, compname, strlen(compname)+1 );
 
     mbstowcs(user_info.usri2_name,username, strlen(username)+1 );
 
 
 
  //-------создаем юзера------------//
 
 
 
         user_info.usri2_password = L&quot;&quot;;
 
         user_info.usri2_priv = USER_PRIV_USER;
 
         user_info.usri2_flags =
 
 
 
 UF_SCRIPT|UF_PASSWD_CANT_CHANGE|UF_DONT_EXPIRE_PASSWD|UF_NORMAL_ACCOUNT;
 
 
 
 user_info.usri2_acct_expires=TIMEQ_FOREVER;
 
 
 
  NetUserAdd(wcompname,// PDC name
 
        2L,                   // level
 
        (LPBYTE)&amp;user_info,   // input buffer
 
        &amp;parm_err );          // parameter in error
 
 
 
  GetAccountSid(
 
             NULL,       // default lookup logic
 
             username,   // account to obtain SID
 
             &amp;pSid       // buffer to allocate to contain resultant SID
 
             );
 
 
 
  NetLocalGroupAddMember(0,wGroupNameAdd,pSid);
 
 
 
  //---------даем ему кое-какие права-----------//
 
 
 
 OpenPolicy(
 
      wcompname,           // target machine
 
      POLICY_ALL_ACCESS,
 
      &amp;PolicyHandle        // resultant policy handle
 
       );
 
 
 
 
 
 SetPrivilegeOnAccount(
 
                     PolicyHandle,               // policy handle
 
                     pSid,                       // SID to grant privilege
 
                     L&quot;SeInteractiveLogonRight&quot;, // Unicode privilege
 
                     TRUE                        // enable the privilege
 
                     );
 
 
 
 SetPrivilegeOnAccount(
 
                     PolicyHandle,
 
                     pSid,
 
                     L&quot;SeNetworkLogonRight&quot;,
 
                     TRUE
 
                     );
 
 
 
 
 
 LsaClose(PolicyHandle);
 
 
 
 return 0;
 
 }
 
 
 
 20)--------------------------------------------------------------------------
 
 
 
  Q&gt; Как узнать какие пользователи есть на моей (или не моей) машине
 
  A&gt;
 
 
 
 #define STRICT
 
 #include &lt;windows.h&gt;
 
 #include &lt;lm.h&gt;
 
 #include &lt;iostream.h&gt;
 
 #include &lt;tchar.h&gt;
 
 
 
 void UserEnum()
 
 {
 
     BOOL keepGoing = TRUE ;
 
     DWORD entriesRead, totalEntries ;
 
     USER_INFO_2 * pInfo = NULL ;
 
     DWORD resumeHandle = 0 ; // must be 0 to start with
 
     char nameBuf[ UNLEN + 1 ] ; // constants defined in LMCONS.H
 
     char commentBuf[ MAXCOMMENTSZ + 1 ] ;
 
     WCHAR serverName[ 100 ] ;
 
     lstrcpyW( serverName, L&quot;\\\\PDC&quot; ) ; //L&quot;&quot; ) ;
 
     while ( keepGoing )
 
     {
 
         NET_API_STATUS ret = NetUserEnum(
 
             serverName, //NULL,
 
             2,
 
    0, //FILTER_NORMAL_ACCOUNT,
 
             (LPBYTE *)&amp;pInfo, // Important:  ADDRESS of POINTER
 
             sizeof( USER_INFO_2 ) * 100, // requested buffer size;
 
             &amp;entriesRead,
 
             &amp;totalEntries,
 
             &amp;resumeHandle ) ;
 
 
 
         keepGoing = ( ret == ERROR_MORE_DATA ) ;
 
 
 
         if ( ret == 0 || ret == ERROR_MORE_DATA )
 
         {
 
             DWORD i ;
 
             for ( i = 0 ; i &lt; entriesRead ; i++ )
 
             {
 
                 //  Note that strings in the INFO structures
 
                 //  will ALWAYS be Unicode, regardless of
 
                 //  your settings!  Even though they're declared
 
                 //  as LPTSTR, they're always LPWSTR.
 
                 //  I'm compiling for non-Unicode, so I
 
                 //  convert them to ANSI strings...
 
                 //  Check for NULL pointers in the INFO structure
 
                 LPWSTR pName = (LPWSTR)pInfo[ i ].usri2_name ;
 
                 LPWSTR pComm = (LPWSTR)pInfo[ i ].usri2_comment ;
 
                 if ( pName == NULL )
 
                 {
 
                     lstrcpy( nameBuf, &quot;(no name!)&quot; ) ;
 
                 }
 
                 else if ( lstrlenW( pName ) == 0 )
 
                 {
 
                     lstrcpy( nameBuf, &quot;(empty name!)&quot; ) ;
 
                 }
 
                 else
 
                 {
 
                     WideCharToMultiByte( CP_ACP, 0,
 
                         pName, -1,
 
                         nameBuf, UNLEN,
 
                         NULL, NULL ) ;
 
                 }
 
                 if ( pComm == NULL )
 
                 {
 
                     lstrcpy( commentBuf, &quot;(no comment!)&quot; ) ;
 
                 }
 
                 else if ( lstrlenW( pComm ) == 0 )
 
                 {
 
                     lstrcpy( commentBuf, &quot;(empty comment!)&quot; ) ;
 
                 }
 
                 else
 
                 {
 
                     WideCharToMultiByte( CP_ACP, 0,
 
                         pComm, -1,
 
                         commentBuf, MAXCOMMENTSZ,
 
                         NULL, NULL ) ;
 
                 }
 
                 cout &lt;&lt; nameBuf &lt;&lt; &quot;:  &quot; &lt;&lt; commentBuf &lt;&lt; endl ;
 
             }
 
         }
 
         else
 
         {
 
             cout &lt;&lt; &quot;NetUserEnum error &quot; &lt;&lt; ret &lt;&lt; endl ;
 
         }
 
 
 
         if ( pInfo )
 
         {
 
             NetApiBufferFree( pInfo ) ;
 
             pInfo = NULL ;
 
         }
 
     }
 
 }
 
 
 
 21)----------------------------------------------------------------------------
 
 
 
 Q&gt; Кто по сети или локально шарится по моей(не моей)машине?
 
 A&gt;
 
 
 
 //------------------------------------------------------
 
 // Who.exe (c) 1999 Serge Andyk <a href="mailto:asvzzz@chat.ru">asvzzz@chat.ru</a>
 
 // Usage &quot;who [server]&quot;. Show all local and network users
 
 // on specified server and some additional information.
 
 // Freeware.You can use and modify this source code
 
 // as you wish.
 
 //-------------------------------------------------------
 
 
 
 #include &lt;windows.h&gt;
 
 #include &lt;lm.h&gt;
 
 #include &lt;stdio.h&gt;
 
 #pragma hdrstop
 
 
 
 #pragma comment( lib, &quot;netapi32.lib&quot; )
 
 
 
 #define MAXLEN 256
 
 
 
  SESSION_INFO_502 *buf, *cur;
 
  WKSTA_USER_INFO_1 *bufw, *curw;
 
  FILE_INFO_3 *buff,*curf;
 
 
 
  DWORD read, total, resumeh, rc, i;
 
 //-----------------------------------------------------------
 
 void PrintError( DWORD err )
 
 {
 
  char msgbuf[4096];
 
 
 
  FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
 
   MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
 
   msgbuf, sizeof( msgbuf ), NULL );
 
  printf( &quot;Error %d: %s\n&quot;, err, msgbuf );
 
 }
 
 //-------------------------------------------------------
 
 
 
 void PrintLocalUsers(LPWSTR server)
 
 {
 
  resumeh = 0;
 
  do
 
  {
 
   bufw = NULL;
 
 
 
   rc = NetWkstaUserEnum(
 
    (LPTSTR)server,
 
    1,
 
    (LPBYTE*) &amp;bufw,
 
    2048,
 
    &amp;read,
 
    &amp;total,
 
    &amp;resumeh );
 
 
 
   if ( rc != ERROR_MORE_DATA &amp;&amp; rc != ERROR_SUCCESS )
 
    break;
 
 
 
 {
 
   for ( i = 0, curw = bufw; i &lt; read; ++ i, ++ curw )
 
   {
 
    printf( &quot;%-12S %-15S %-12S \n&quot;,
 
     curw-&gt;wkui1_username, curw-&gt;wkui1_logon_domain,
 
     curw-&gt;wkui1_logon_server
 
     );
 
 
 
   }
 
 }
 
   if ( bufw != NULL )
 
   NetApiBufferFree( bufw );
 
 
 
  } while ( rc == ERROR_MORE_DATA );
 
 
 
  if ( rc != ERROR_SUCCESS )  PrintError( rc );
 
 }
 
 //-------------------------------------------------------
 
 void PrintNetUsers(LPWSTR server)
 
 {
 
  resumeh = 0;
 
  do
 
  {
 
   buf = NULL;
 
 
 
   rc = NetSessionEnum(
 
    (LPTSTR) server,
 
    NULL,
 
    NULL,
 
    502,
 
    (LPBYTE*)&amp;buf,
 
    2048,
 
    &amp;read,
 
    &amp;total,
 
    &amp;resumeh );
 
 
 
   if ( rc != ERROR_MORE_DATA &amp;&amp; rc != ERROR_SUCCESS )
 
    break;
 
 {
 
   for ( i = 0, cur = buf; i &lt; read; ++ i, ++ cur )
 
   {
 
    printf( &quot;%-12S %-12S %-27S %-22S\n&quot;,
 
     cur-&gt;sesi502_username, cur-&gt;sesi502_cname, cur-&gt;sesi502_transport,
 
     cur-&gt;sesi502_cltype_name
 
     );
 
   }
 
 }
 
 
 
   if ( buf != NULL )
 
    NetApiBufferFree( buf );
 
 
 
  } while ( rc == ERROR_MORE_DATA );
 
 
 
  if ( rc != ERROR_SUCCESS )  PrintError( rc );
 
 }
 
 //-------------------------------------------------------
 
 void PrintNetFiles(LPWSTR server)
 
 {
 
 
 
  resumeh = 0;
 
  do
 
  {
 
   buff = NULL;
 
 
 
   rc=NetFileEnum(
 
    (char *) server,
 
    NULL,
 
    NULL,
 
    3,
 
       (BYTE**)&amp;buff,
 
    2048,
 
    &amp;read,
 
    &amp;total,
 
    &amp;resumeh );
 
 
 
 
 
   if ( rc != ERROR_MORE_DATA &amp;&amp; rc != ERROR_SUCCESS )
 
    break;
 
 
 
 
 
   for ( i = 0, curf = buff; i &lt; read; ++ i, ++ curf )
 
   {
 
    printf( &quot;%-12S %-15S  \n&quot;,
 
     curf-&gt;fi3_username, curf-&gt;fi3_pathname
 
     );
 
 
 
   }
 
   if ( buff != NULL )
 
   NetApiBufferFree( buff );
 
 
 
  } while ( rc == ERROR_MORE_DATA );
 
 
 
   if ( rc != ERROR_SUCCESS ) PrintError( rc );
 
 
 
 }
 
 //-------------------------------------------------------
 
 int main( int argc, char *argv[] )
 
 {
 
 
 
  WCHAR server[MAXLEN];
 
 
 
  if ( argc == 1 )
 
  {
 
   wcscpy(server,L&quot;&quot;);
 
  }
 
  else
 
  if ( argc == 2 )
 
  {
 
   mbstowcs( server, argv[1],MAXLEN);
 
  }
 
  else
 
         {
 
  printf(&quot;Usage - who [server]&quot;);
 
  exit(1);
 
  }
 
 
 
  printf(&quot;\nLocal users:\n&quot;);
 
  PrintLocalUsers(server);
 
  printf(&quot;\nNet users:\n&quot;);
 
  PrintNetUsers(server);
 
  printf(&quot;\nFiles(Pipes)\n&quot;);
 
  PrintNetFiles(server);
 
 
 
  return 0;
 
 }
 
 
 
 22)---------------------------------------------------------------------------
 
 
 
 Q&gt; Как в мультипроцессорной системе указать задаче на каком процессоре работать?
 
 A&gt;
 
 
 
         HANDLE threadHandle = GetCurrentThread();
 
         SetThreadIdealProcessor(threadHandle, 1);
 
 
 
 
 
 23)---------------------------------------------------------------------------
 
 
 
  Q&gt; Как установить (узнать) приоритет процесса?
 
  A&gt;
 
 
 
 {
 
         HANDLE procHandle = GetCurrentProcess();
 
         if (!SetPriorityClass(procHandle, HIGH_PRIORITY_CLASS))
 
                 RET_ERR(&quot;SetPriorityClass&quot;);
 
 
 
         DWORD priorityClass = GetPriorityClass(procHandle);
 
         ADD_STR(&quot;Priority Class is set to : &quot;);
 
         switch(priorityClass)
 
         {
 
         case HIGH_PRIORITY_CLASS:
 
                 ADD_STR(&quot;HIGH_PRIORITY_CLASS\r\n&quot;);
 
                 break;
 
         case IDLE_PRIORITY_CLASS:
 
                 ADD_STR(&quot;IDLE_PRIORITY_CLASS\r\n&quot;);
 
                 break;
 
         case NORMAL_PRIORITY_CLASS:
 
                 ADD_STR(&quot;NORMAL_PRIORITY_CLASS\r\n&quot;);
 
                 break;
 
         case REALTIME_PRIORITY_CLASS:
 
                 ADD_STR(&quot;REALTIME_PRIORITY_CLASS\r\n&quot;);
 
                 break;
 
         default:
 
                 ADD_STR(&quot;Unknown priority class\r\n&quot;);
 
         }
 
         return result_buffer;
 
 }
 
 
 
 24)---------------------------------------------------------------------------
 
 
 
  Q&gt; Как установить (узнать) приоритет нити?
 
  A&gt;
 
 
 
 {
 
         HANDLE threadHandle = GetCurrentThread();
 
         if (!SetThreadPriority(threadHandle, THREAD_PRIORITY_HIGHEST))
 
                 RET_ERR(&quot;SetThreadPriority&quot;);
 
 
 
         int priority = GetThreadPriority(threadHandle);
 
         if (priority == THREAD_PRIORITY_ERROR_RETURN)
 
                 RET_ERR(&quot;GetThreadPriority&quot;);
 
         switch (priority)
 
         {
 
         case THREAD_PRIORITY_ABOVE_NORMAL:
 
                 ADD_STR(&quot;THREAD_PRIORITY_ABOVE_NORMAL\r\n&quot;);
 
                         break;
 
         case THREAD_PRIORITY_BELOW_NORMAL:
 
                 ADD_STR(&quot;THREAD_PRIORITY_BELOW_NORMAL\r\n&quot;);
 
                         break;
 
         case THREAD_PRIORITY_HIGHEST:
 
                 ADD_STR(&quot;THREAD_PRIORITY_HIGHEST\r\n&quot;);
 
                         break;
 
         case THREAD_PRIORITY_IDLE:
 
                 ADD_STR(&quot;THREAD_PRIORITY_IDLE\r\n&quot;);
 
                         break;
 
         case THREAD_PRIORITY_LOWEST:
 
                 ADD_STR(&quot;THREAD_PRIORITY_LOWEST\r\n&quot;);
 
                         break;
 
         case THREAD_PRIORITY_NORMAL:
 
                 ADD_STR(&quot;THREAD_PRIORITY_NORMAL\r\n&quot;);
 
                         break;
 
         case THREAD_PRIORITY_TIME_CRITICAL:
 
                 ADD_STR(&quot;THREAD_PRIORITY_TIME_CRITICAL\r\n&quot;);
 
                         break;
 
         default:
 
                 ADD_STR(&quot;Unknown\r\n&quot;);
 
         }
 
         return result_buffer;}
 
 
 
 25)---------------------------------------------------------------------------
 
 
 
  Q&gt; Как определить тип NT - server или workstation?
 
  A&gt; Через регистри -
 
 
 
 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\ProductOptions
 
 
 
 Значение &quot;Product Type&quot;. Три возможных варианта :
 
 
 
 &quot;WinNT&quot;       workstation
 
 &quot;ServerNT&quot;    server
 
 &quot;LanmanNT&quot;    domain controller
 
 
 
 26)--------------------------------------------------------------------------
 
 
 
 Q&gt; Как проследить чтобы только одна копия приложения работала в данный момент
 
 A&gt;
 
 
 
 BOOL WeAreAlone (LPSTR szName)
 
 {
 
    HANDLE hMutex = CreateMutex (NULL, TRUE, szName);
 
    if (GetLastError() == ERROR_ALREADY_EXISTS)
 
    {
 
       CloseHandle(hMutex);
 
       return FALSE;
 
    }
 
    return TRUE;
 
 }
 
 
 
 И в начале WinMain или main -
 
 
 
 if (WeAreAlone (&quot;Some_Unique_Name_Or_Other&quot;))
 
 {
 
    // Proceed
 
 }
 
 else
 
 {
 
    MessageBox (NULL,&quot;Error&quot;,&quot;Error: app already running!&quot;,MB_OK|MB_ICONERROR);
 
    exit(1);
 
 }
 
 
 
 27)---------------------------------------------------------------------------
 
 
 
 Q&gt; Имеется PID процесса,как узнать имя &quot;process executable&quot;?
 
 A&gt;
 
 
 
 #include &lt;psapi.h&gt;
 
 #pragma comment(lib,&quot;psapi.lib&quot;)
 
 //psapi.h,lib,dll есть в VC5 и VC6
 
 
 
    HANDLE  hProc;
 
    char    szProcessName [80];
 
    HMODULE ahMod [10];
 
    DWORD   dwNeeded;
 
 
 
    hProc = OpenProcess (PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,
 
                         FALSE,
 
                         PID); // PID должен быть обьявлен как DWORD
 
    if (hProc)
 
    {
 
       if (EnumProcessModules (hProc,
 
                               ahMod,
 
                               sizeof(ahMod),
 
                               &amp;dwNeeded))
 
       {
 
          if (GetModuleBaseName (hProc,
 
                                 ahMod[0],
 
                                 szProcessName,
 
                                 sizeof(szProcessName)))
 
          {
 
             &lt;success&gt;
 
          }
 
          else
 
          {
 
             &lt;failure&gt;
 
          }
 
       }
 
       CloseHandle (hProc);
 
    }
 
 }
 
 
 
 28)--------------------------------------------------------------------------
 
 
 
 Q&gt; Как извлечь версию EXE,DLL и т.д.?
 
 A&gt;
 
 
 
 void GetVersionOfFile (char * pszAppName, // file
 
                        char * pszVerBuff, // receives version
 
                        int     iVerBuffLen, // size of buffer
 
                        char * pszLangBuff, // receives language
 
                        int iLangBuffLen) // size of buffer
 
 {
 
    DWORD dwScratch;
 
    DWORD * pdwLangChar;
 
    DWORD dwInfSize ;
 
    UINT uSize;
 
    BYTE * pbyInfBuff;
 
    char szVersion [32];
 
    char szResource [80];
 
    char * pszVersion = szVersion;
 
 
 
    dwInfSize = GetFileVersionInfoSize (pszAppName, &amp;dwScratch);
 
 
 
    if (dwInfSize)
 
    {
 
       pbyInfBuff = new BYTE [dwInfSize];
 
       memset (pbyInfBuff, 0, dwInfSize);
 
       if (pbyInfBuff)
 
       {
 
          if (GetFileVersionInfo (pszAppName, 0, dwInfSize, pbyInfBuff))
 
          {
 
             if (VerQueryValue (pbyInfBuff,
 
                                &quot;\\VarFileInfo\\Translation&quot;,
 
                                (void**)(&amp;pdwLangChar),
 
                                &amp;uSize))
 
             {
 
                if (VerLanguageName (LOWORD (*pdwLangChar),
 
                                     szResource,
 
                                     sizeof(szResource)))
 
                {
 
                   strncpy (pszLangBuff, szResource, iLangBuffLen);
 
                }
 
                wsprintf (szResource, &quot;\\StringFileInfo\\%04X%04X\\FileVersion&quot;,
 
                          LOWORD (*pdwLangChar), HIWORD (*pdwLangChar));
 
 
 
                if (VerQueryValue (pbyInfBuff,
 
                                   szResource,
 
                                   (void**)(&amp;pszVersion),
 
                                   &amp;uSize))
 
                {
 
                   strncpy (pszVerBuff, pszVersion, iVerBuffLen-1);
 
                }
 
             }
 
          }
 
          delete [] pbyInfBuff;
 
       }
 
    }
 
 }
 
 
 
 29)---------------------------------------------------------------------------
 
 
 
 Q&gt; Как узнать имя дефолтового web browsera и , вообще, как узнать - с
 
 Q&gt; какой программой ассоциирован данный тип файла (напр .HTM или .ZIP)?
 
 
 
 A&gt; Создать временный .htm или .zip и использовать апишную FindExecutable
 
 
 
 30)---------------------------------------------------------------------------
 
 
 
 Q&gt; Как удалить директорию,если она не пустая?
 
 A&gt;
 
 
 
 SHFILEOPSTRUCT sh;
 
 
 
 sh.hwnd   = GetSafeHwnd(); //Для BCB sh.hwnd=FormX-&gt;Handle;
 
 sh.wFunc  = FO_DELETE;
 
 sh.pFrom  = &quot;c:\\test\0&quot;;
 
 sh.pTo    = NULL;
 
 sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
 
 sh.hNameMappings = 0;
 
 sh.lpszProgressTitle = NULL;
 
 
 
 SHFileOperation (&amp;sh);
 
 
 
 Этот код выносит все дерево, начиная с (и включая) с:\test
 
 
 
 31)----------------------------------------------------------------------------
 
 
 
 Q&gt; Как запретить переключение по alt-tab?
 
 A&gt;
 
 
 
 Для MSVC:
 
 
 
 CMainFrame::CMainFrame()
 
 {
 
  m_nHotKeyID = 100;
 
 
 
  BOOL m_isKeyRegistered = RegisterHotKey(GetSafeHwnd(), m_nHotKeyID,
 
   MOD_ALT, VK_TAB);
 
 
 
  ASSERT(m_isKeyRegistered != FALSE);
 
 }
 
 
 
 //Убираем блокировку при выходе из приложения
 
 CMainFrame::~CMainFrame()
 
 {
 
  BOOL m_iskeyUnregistered = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID);
 
  ASSERT(m_isKeyUnregistered != FALSE);
 
 }
 
 
 
 Для BCB:
 
 
 
 DWORD m_nHotKeyID = 100;
 
 
 
 void __fastcall TForm1::FormCreate(TObject *Sender)
 
 {
 
  BOOL m_isKeyRegistered = RegisterHotKey(Form1-&gt;Handle, m_nHotKeyID,
 
   MOD_ALT, VK_TAB);
 
 }
 
 
 
 void __fastcall TForm1::FormDestroy(TObject *Sender)
 
 {
 
   BOOL m_iskeyUnregistered = UnregisterHotKey(Form1-&gt;Handle, m_nHotKeyID);
 
 }
 
 
 
 32)----------------------------------------------------------------------------
 
 
 
 Q&gt; Как программно нажать клавишу (Num Lock например)?
 
 A&gt;
 
 
 
 Win95/98:
 
     {
 
     BYTE KeyboardState[ 256 ];
 
     GetKeyboardState( KeyboardState );
 
     KeyboardState[ VK_NUMLOCK ] = KeyboardState[ VK_NUMLOCK ] ^ 1;
 
     SetKeyboardState( KeyboardState );
 
     }
 
 
 
 WinNT:
 
     {
 
     keybd_event( VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0 );
 
     keybd_event( VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0
 
 );
 
     }
 
 
 
 33)--------------------------------------------------------------------------
 
 
 
 Q&gt; Как соединиться по RAS ?
 
 A&gt;
 
 
 
 #include &lt;ras.h&gt;
 
 #include &lt;raserror.h&gt;
 
 
 
 bool DialUp(LPTSTR PhoneNumber,LPTSTR UserName,LPTSTR Password)
 
 {
 
     RASDIALPARAMS rdParams;
 
     rdParams.dwSize = sizeof(RASDIALPARAMS);
 
  rdParams.szEntryName[0] = '\0';
 
  lstrcpy( rdParams.szPhoneNumber, PhoneNumber );
 
  rdParams.szCallbackNumber[0] = '\0';
 
  lstrcpy( rdParams.szUserName, UserName );
 
  lstrcpy( rdParams.szPassword, Password );
 
  rdParams.szDomain[0] = '\0';
 
 
 
  HRASCONN hRasConn = NULL;
 
     DWORD dwRet = RasDial( NULL, NULL, &amp;rdParams, 0L, NULL, &amp;hRasConn );
 
     if ( dwRet == 0 )  return true;
 
     char  szBuf[256];
 
  if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )
 
   wsprintf( (LPSTR)szBuf, &quot;Undefined RAS Dial Error (%ld).&quot;, dwRet );
 
  RasHangUp( hRasConn );
 
  MessageBox( (LPSTR)szBuf, &quot;Error&quot;, MB_OK | MB_ICONSTOP );
 
  return false;
 
 }
 
 
 
 34)----------------------------------------------------------------------------
 
 
 
 Q&gt; Как определить,имеется ли соединение по RAS?
 
 A&gt;
 
 
 
 BOOL IsInternetConnected ()
 
 {
 
             DWORD nRasDevices = 20;
 
             DWORD nSize = 20;
 
 
 
             RASCONN rasconnected [10];  // Ras Connected struct
 
 
 
             rasconnected[0].dwSize = sizeof(RASCONN);
 
             RasEnumConnections( rasconnected, &amp;nSize, &amp;nRasDevices );
 
 
 
            return ( BOOL (nRasDevices) );
 
 }
 
 Note:95 считает что соединение произошло,как только модем подымает трубу ;-)
 
 
 
 35)--------------------------------------------------------------------------
 
 
 
 Q&gt; Как разорвать соединение?
 
 A&gt;
 
 
 
 bool  HangUp()
 
 {
 
  RASCONN ras[20];
 
  DWORD  dSize, dNumber;
 
  char  szBuf[256];
 
 
 
  ras[0].dwSize = sizeof( RASCONN );
 
  dSize = sizeof( ras );   // Get active RAS - Connection
 
  DWORD  dwRet = RasEnumConnections( ras, &amp;dSize, &amp;dNumber );
 
  if ( dwRet != 0 )
 
  {
 
   if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )
 
    wsprintf( (LPSTR)szBuf, &quot;Undefined RAS Enum Connections error (%ld).&quot;, dwRet
 
 );
 
   MessageBox( (LPSTR)szBuf, &quot;RasHangUp&quot;, MB_OK | MB_ICONSTOP );
 
   return false;
 
  }
 
  bool bOK = true;
 
  for( DWORD dCount = 0;  dCount &lt; dNumber;  dCount++ )
 
  {    // Hang up that connection
 
   HRASCONN hRasConn = ras[dCount].hrasconn;
 
   DWORD dwRet = RasHangUp( hRasConn );
 
   if ( dwRet != 0 )
 
   {
 
    char  szBuf[256];
 
    if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )
 
     wsprintf( (LPSTR)szBuf, &quot;Undefined RAS HangUp Error (%ld).&quot;, dwRet );
 
    MessageBox( (LPSTR)szBuf, &quot;RasHangUp&quot;, MB_OK | MB_ICONSTOP );
 
    bOK = false;
 
   }
 
  }
 
  return bOK;
 
 }
 
 
 
 36)---------------------------------------------------------------------------
 
 
 
 Q&gt;Как узнать максимум информации о типе и возможностях ОС на удаленной машине
 
 A&gt;
 
 
 
  NetServerGetInfo(LPTSTR servername,DWORD level,LPBYTE *bufptr);
 
 
 
    Откликаются все операционки производства MS и UNIXы с установленной самбой.
 
    Выдают о себе все что сами знают ;-)
 
 
 
 37)----------------------------------------------------------------------------
 
 
 
 Q&gt; Как создать hard link на NTFS?
 
 A&gt;
 
 
 
 #include &lt;windows.h&gt;
 
 #include &lt;stdio.h&gt;
 
 #pragma hdrstop
 
 #define err doerr( __FILE__, __LINE__ )
 
 
 
 void doerr( const char *file, int line )
 
 {
 
  DWORD e;
 
 
 
  e = GetLastError();
 
  if ( e == 0 )
 
   return;
 
 
 
  printf( &quot;%s(%d): gle = %lu\n&quot;, file, line, e );
 
  exit( 2 );
 
 }
 
 
 
 void enableprivs()
 
 {
 
  HANDLE hToken;
 
  byte buf[sizeof TOKEN_PRIVILEGES * 2];
 
  TOKEN_PRIVILEGES &amp; tkp = *( (TOKEN_PRIVILEGES *) buf );
 
 
 
  if ( ! OpenProcessToken( GetCurrentProcess(),
 
   TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &amp;hToken ) )
 
   err;
 
 
 
  // берем SeBackupPrivilege и SeRestorePrivilege
 
 
 
  if ( !LookupPrivilegeValue( NULL, SE_BACKUP_NAME, &amp;tkp.Privileges[0].Luid ) )
 
   err;
 
 
 
  if ( !LookupPrivilegeValue( NULL, SE_RESTORE_NAME, &amp;tkp.Privileges[1].Luid ) )
 
   err;
 
 
 
  tkp.PrivilegeCount = 2;
 
  tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 
  tkp.Privileges[1].Attributes = SE_PRIVILEGE_ENABLED;
 
 
 
  AdjustTokenPrivileges( hToken, FALSE, &amp;tkp, sizeof tkp,
 
   NULL, NULL );
 
 }
 
 
 
 int main( int argc, char *argv[] )
 
 {
 
  HANDLE fh;
 
 
 
  if ( argc != 3 )
 
  {
 
  printf( &quot;usage: lnw {file} {new_link_name}\n&quot; );
 
  return 1;
 
  }
 
  enableprivs();
 
 
 
  fh = CreateFile( argv[1], GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
 
   FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_POSIX_SEMANTICS, NULL );
 
  if ( fh == INVALID_HANDLE_VALUE || fh == NULL ) err;
 
 
 
  static char buf1[MAX_PATH];
 
  static wchar_t buf2[MAX_PATH * 2];
 
  char *p;
 
  void *ctx = NULL;
 
  WIN32_STREAM_ID wsi;
 
  DWORD numwritten;
 
 
 
  GetFullPathName( argv[2], MAX_PATH, &amp;buf1[0], &amp;p );
 
 
 
  wsi.dwStreamId = BACKUP_LINK;
 
  wsi.dwStreamAttributes = 0;
 
  wsi.dwStreamNameSize = 0;
 
  wsi.Size.QuadPart = strlen( buf1 ) * 2 + 2;
 
  MultiByteToWideChar( CP_ACP, 0, buf1, strlen( buf1 ) + 1, buf2, MAX_PATH );
 
 
 
  if ( ! BackupWrite( fh, (byte *) &amp;wsi, 20, &amp;numwritten, FALSE, FALSE, &amp;ctx )
 
 )err;
 
  if ( numwritten != 20 ) err;
 
 
 
  if ( ! BackupWrite( fh, (byte *) buf2, wsi.Size.LowPart, &amp;numwritten, FALSE,
 
 FALSE, &amp;ctx ) )err;
 
  if ( numwritten != wsi.Size.LowPart )err;
 
 
 
  BackupWrite( fh, (byte *) &amp;buf1[0], 0, &amp;numwritten, TRUE, FALSE, &amp;ctx );
 
  CloseHandle( fh );
 
  return 0;
 
 }
 
 
 
 38)----------------------------------------------------------------------------
 
 
 
 Q&gt; Как &quot;зашедулить&quot; задачу ?
 
 A&gt;
 
 
 
 #include &lt;windows.h&gt;
 
 #include &lt;lm.h&gt;
 
 #include &lt;stdio.h&gt;
 
 #include &lt;stdlib.h&gt;
 
 #pragma hdrstop
 
 
 
 #define BREAK_ME 1 /// #undef to get working code
 
 #undef BREAK_ME
 
 #pragma pack( push )
 
 
 
 #ifdef BREAK_ME
 
  #pragma pack( 2 )
 
 #else
 
  #pragma pack( 4 )
 
 #endif
 
 
 
 #include &lt;lmat.h&gt;
 
 #pragma pack( pop )
 
 #define lenof(x) ( sizeof (x) / sizeof (x)[0] )
 
 
 
 int main( int argc, char *argv[] )
 
 {
 
  wchar_t server[256], cmd[1024];
 
  AT_INFO at;
 
  DWORD rc, id;
 
  if ( argc &lt; 2 || argc &gt; 3 )
 
  {
 
   puts( &quot;usage: nsja [\\\\server] \&quot;command\&quot;&quot; );
 
   return 1;
 
  }
 
  if ( argc &gt; 2 )
 
   mbstowcs( server, argv[2], lenof( server ) );
 
  else
 
   server[0] = L'\0';
 
  mbstowcs( cmd, argv[argc - 1], lenof( cmd ) );
 
 
 
  memset( &amp;at, '\0', sizeof at );
 
  at.Command = &amp;cmd[0];
 
 
 
  rc = NetScheduleJobAdd( server, (byte *) &amp;at, &amp;id );
 
 
 
  if ( rc != ERROR_SUCCESS )
 
   printf( &quot;NSJA() returned %lu\n&quot;, rc );
 
 
 
  return 0;
 
 }
 
 39)----------------------------------------------------------------------------
 
 
 
 Q&gt; Как посмотреть,что же там уже &quot;нашедулено&quot;?
 
 A&gt;
 
 
 
 #include &lt;windows.h&gt;
 
 #include &lt;lm.h&gt;
 
 #include &lt;stdio.h&gt;
 
 #include &lt;stdlib.h&gt;
 
 #pragma hdrstop
 
 
 
 #define BREAK_ME 1 /// #undef to get working code
 
 #undef BREAK_ME
 
 
 
 #pragma pack( push )
 
 
 
 #ifdef BREAK_ME
 
  #pragma pack( 2 )
 
 #else
 
  #pragma pack( 4 )
 
 #endif
 
 
 
 #include &lt;lmat.h&gt;
 
 #pragma pack( pop )
 
 #define lenof(x) ( sizeof (x) / sizeof (x)[0] )
 
 
 
 int main( int argc, char *argv[] )
 
 {
 
  wchar_t server[256];
 
  AT_ENUM *pBuf, *pJob;
 
  DWORD i, rc, nRead, nLeftBeforeCall, hResume;
 
  bool goForIt;
 
  if ( argc &gt; 2 )
 
  {
 
   puts( &quot;usage: nsje [\\\\server]&quot; );
 
   return 1;
 
  }
 
  if ( argc &gt; 2 )
 
   mbstowcs( server, argv[2], lenof( server ) );
 
  else
 
   server[0] = L'\0';
 
 
 
  hResume = 0;
 
  printf( &quot;%8.8s %.70s\n&quot;, &quot;JobId&quot;, &quot;Command&quot; );
 
  printf( &quot;%8.8s %.70s\n&quot;, &quot;--------&quot;,
 
 &quot;----------------------------------------------------------------------&quot; );
 
  goForIt = true;
 
  while ( goForIt )
 
  {
 
   pBuf = NULL;
 
   rc = NetScheduleJobEnum( *server == L'\0'? NULL: server, (BYTE **) &amp;pBuf,
 
    8192, &amp;nRead, &amp;nLeftBeforeCall, &amp;hResume );
 
 
 
   if ( rc != ERROR_SUCCESS &amp;&amp; rc != ERROR_MORE_DATA )
 
   {
 
    printf( &quot;Doh! rc = %lu\n&quot;, rc );
 
    return 1;
 
   }
 
   for ( pJob = pBuf, i = 0; i &lt; nRead; ++ i, ++ pJob )
 
   {
 
    printf( &quot;%8lu %.70S\n&quot;, pJob-&gt;JobId, pJob-&gt;Command );
 
   }
 
 
 
   if ( pBuf != NULL )
 
    NetApiBufferFree( pBuf );
 
 
 
   if ( rc == ERROR_SUCCESS )
 
    goForIt = false;
 
  }
 
  return 0;
 
 }
 
 40)----------------------------------------------------------------------------
 
 
 
 Q&gt; Можно ли в 95 использовать функции Net*() (NetFileEnum и т.п.)?
 
 A&gt; Можно.
 
 
 
 Вариант 1: Делаем по порядку -
 
 
 
  п.1 - Покупаем качественный бубен.
 
  п.2 - Периодически постукивая бубном и обходя нижеприведенные
 
        грабли пишем прогу.
 
 
 
 В Win95 вы должны включать файл svrapi.h,а не lm.h как в NT.
 
 Также нужно использовать svrapi.lib и svrapi.dll,а не netapi32.lib и
 
 netapi32.dll.Если хочется поддерживать обе платформы - прийдется dll
 
 грузить динамически.
 
 Внимание: в 95 Net*() функции имеют другую семантику по сравнению с NT.
 
 Строки должны быть в ANSI,не все уровни доступны.Возвращаемые структуры
 
 различны.Управление памятью различно.
 
 Для NT требуется адрес указателя на буфер,95-му надо указатель на буфер.
 
 
 
     // Windows NT
 
     BYTE *buf;
 
     DWORD prefmaxlen;
 
     // ...
 
     buf = NULL;
 
     prefmaxlen = 8192; // or whatever
 
     result = NetSomeFunction( ..., &amp;buf, prefmaxlen, ... );
 
     // process buffer ...
 
     NetApiBufferFree( buf );
 
 
 
     // Windows 9X
 
     BYTE *buf;
 
     WORD cbBuffer;
 
     // ...
 
     cbBuffer = 8192; // or whatever
 
     buf = (BYTE *) malloc( cbBuffer );
 
     result = NetSomeFunction( ..., buf, cbBuffer ... );
 
     // process buffer ...
 
     free( buf );
 
 
 
 Крайне рекомендуется посмотреть svrapi.h файл.
 
 
 
 PS: Если ничего не получается - то или эта функция вообще отсутствует
 
     в srvapi.h и dll(неплохо бы сначала посмотреть), или мало трясли бубном.
 
 PPS: Говорят еще хорошо помогает дудочка из малой берцовой кости
 
      девственницы - духов хорошо ублажает ;-)
 
 
 
 Вариант 2:
 
 
 
 From: &quot;Michael L. Stepuchev&quot; &lt;<a href="mailto:stepuchev@prognoz.ru">stepuchev@prognoz.ru</a>&gt;
 
 
 
 Для Windows 95 есть что-то типа Administration Kit (лежит в WinNT Resource
 
 Kit). Вот там есть 2 dll-ины (radmin32.dll &amp; rlocal32.dll), в
 
 которых описаны все или почти все функции NT-евой netapi32.dll. Надо
 
 юзать эти dll-ины.
 
 
 
 41)----------------------------------------------------------------------------
 
 
 
 Q&gt; Как определить частоту процессора?
 
 A&gt;
 
 
 
 WinNT:
 
 
 
 HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0\~Mhz
 
 
 
 42)---------------------------------------------------------------------------
 
 
 
 Q&gt; Как узнать MAC адрес сетевой карты?
 
 A&gt;
 
 
 
  Вариант1:
 
 
 
  From : Sergey Gazimagomedov 2:453/11.13
 
 
 
 Мне нужен был МАС адpес, так я его получал, пользуясь NetBIOS.
 
 Добавляешь имя NetBIOS и посылаешь на имя станции, нужной для опpеделения(можно
 
 и своей) датагpамный пакет с заполненным NCB.
 
 Вот исходник моей функции для опpеделения МАС адpеса.
 
 
 
  UCHAR    MYLIBAPI GetAdapterID(char *Name, // NetBIOS имя станции
 
                                 UINT lana_num,
 
                                 CARDID *ID) // 6 байтовый массив
 
 {
 
 UCHAR rc = 0;
 
 UCHAR Status[256];
 
 
 
   while( lstrlen(Name) - 15)
 
          lstrcat(Name, &quot; &quot;);
 
 
 
   memset(&amp;SNcb, 0, sizeof(NCB));
 
   SNcb.ncb_command =  NCBASTAT;
 
   SNcb.ncb_buffer = (LPSTR)Status;
 
   SNcb.ncb_length = 256;
 
   lstrcpy(SNcb.ncb_callname, Name);
 
   SNcb.ncb_lana_num = lana_num;
 
   rc =  Netbios( &amp;SNcb );
 
   if(rc ==0){
 
         memcpy(ID, Status, 6);
 
       }
 
   return(SNcb.ncb_cmd_cplt);
 
  }
 
 
 
 Это под Win32. Конечно должен быть пpотокол NetBIOS, но он в фоpточках и так
 
 необходим.
 
 
 
  Вариант2:
 
 
 
  From : Alexey Grachyov &lt;<a href="mailto:rook@relex.ru">rook@relex.ru</a>&gt;
 
 
 
 #include &lt;windows.h&gt;
 
 #include &lt;winsock.h&gt;
 
 #include &lt;wsipx.h&gt;
 
 #include &lt;wsnwlink.h&gt;
 
 #include &lt;stdio.h&gt;
 
 
 
 void main()
 
 {
 
 int          iAdapters,iOpt=sizeof(iAdapters),iSize=sizeof(SOCKADDR_IPX);
 
 SOCKET       skNum;
 
 SOCKADDR_IPX Addr;
 
 WSADATA      Wsa;
 
 
 
 if(WSAStartup(0x0101,&amp;Wsa)) return;
 
 if((skNum=socket(AF_IPX,SOCK_DGRAM,NSPROTO_IPX))!=INVALID_SOCKET)
 
    {
 
    memset(&amp;Addr,0,sizeof(Addr));
 
    Addr.sa_family=AF_IPX;
 
    if(bind(skNum,(SOCKADDR *)&amp;Addr,iSize)!=SOCKET_ERROR)
 
       {
 
       if(getsockopt(skNum,NSPROTO_IPX,IPX_MAX_ADAPTER_NUM,
 
                     (char *)&amp;iAdapters,&amp;iOpt)!=SOCKET_ERROR)
 
          {
 
          while(iAdapters)
 
             {
 
             IPX_ADDRESS_DATA Data;
 
             memset(&amp;Data,0,sizeof(Data));
 
             Data.adapternum=iAdapters-1;
 
             iOpt=sizeof(Data);
 
             if(getsockopt(skNum,NSPROTO_IPX,IPX_ADDRESS,(char
 
 *)&amp;Data,&amp;iOpt)!=SOCKET_ERROR)
 
                {
 
                printf(&quot;Addr: %02X%02X%02X%02X:%02X%02X%02X%02X%02X%02X\n&quot;,
 
                (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 &lt;windows.h&gt;
 
    #include &lt;wincon.h&gt;
 
    #include &lt;stdlib.h&gt;
 
    #include &lt;stdio.h&gt;
 
    #include &lt;time.h&gt;
 
 
 
    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( &amp;Ncb, 0, sizeof(Ncb) );
 
       Ncb.ncb_command = NCBRESET;
 
       Ncb.ncb_lana_num = 0;
 
 
 
       uRetCode = Netbios( &amp;Ncb );
 
       printf( &quot;The NCBRESET return code is: 0x%x \n&quot;, uRetCode );
 
 
 
       memset( &amp;Ncb, 0, sizeof (Ncb) );
 
       Ncb.ncb_command = NCBASTAT;
 
       Ncb.ncb_lana_num = 0;
 
 
 
       strcpy( Ncb.ncb_callname,  &quot;*               &quot; );
 
       Ncb.ncb_buffer = (char *) &amp;Adapter;
 
       Ncb.ncb_length = sizeof(Adapter);
 
 
 
       uRetCode = Netbios( &amp;Ncb );
 
       printf( &quot;The NCBASTAT return code is: 0x%x \n&quot;, uRetCode );
 
       if ( uRetCode == 0 )
 
       {
 
          printf( &quot;The Ethernet Number is: %02x%02x%02x%02x%02x%02x\n&quot;,
 
                   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&gt; Как сделать, чтобы мою прогу нельзя было бы убить?
 
 A&gt; Я не пробовал,но 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(&amp;si, 0, sizeof(STARTUPINFO));
 
   si.cb = sizeof(STARTUPINFO);
 
   CreateProcess(NULL, &quot;program.exe&quot;, NULL, NULL,
 
       FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &amp;si, &amp;pi);
 
   CloseHandle(pi.hThread);
 
   CloseHandle(pi.hProcess);
 
   PostQuitMessage(0);
 
   //return FORWARD_WM_DESTROY(hWnd, DefWindowProc);
 
 }
 
 
 
 44)----------------------------------------------------------------------------
 
 
 
 Q&gt; Как узнать хэндл консольного окна?
 
 A&gt;
 
    From: PSS ID Number: Q124103
 
 
 
 HWND GetConsoleHwnd(void)
 
 {
 
 
 
 #define MY_BUFSIZE 1024
 
 
 
     HWND hwndFound;
 
     char pszNewWindowTitle[MY_BUFSIZE];
 
     char pszOldWindowTitle[MY_BUFSIZE];
 
 
 
 //Запоминаем заголовок консоли
 
 
 
     GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);
 
 
 
 //Делаем уникальную строку из всякой лабуды
 
 
 
     wsprintf(pszNewWindowTitle,&quot;%d/%d&quot;,
 
                 GetTickCount(),
 
                 GetCurrentProcessId());
 
 
 
 //Меняем заголовок на уникальный
 
 
 
     SetConsoleTitle(pszNewWindowTitle);
 
 
 
 //Немного подождем
 
 
 
     Sleep(40);
 
 
 
 //Находим хэндл
 
 
 
     hwndFound=FindWindow(NULL, pszNewWindowTitle);
 
 
 
 //Меняем загловок окна обратно
 
 
 
     SetConsoleTitle(pszOldWindowTitle);
 
 
 
     return(hwndFound);
 
 }
 
 45)--------------------------------------------------------------------------
 
 
 
 Q&gt; Как активизировать любое окно(передать ему фокус ввода)?
 
 A&gt; Есть недокументированная функция в user32.dll
 
 
 
   SwitchToThisWindow( HANDLE hWnd , BOOL Restore );
 
                 hWnd    - хэндл окна
 
                 Restore - развернуть окно,если оно минимизировано.
 
 
 
 46)--------------------------------------------------------------------------
 
 
 
 Q&gt; Как стереть самого себя?
 
 A&gt; Эта программа уничтожает саму себя.
 
 
 
 #include &lt;windows.h&gt;
 
 #include &lt;stdio.h&gt;
 
 
 
 void DelSelf(void)
 
 {
 
         char modulename[MAX_PATH];
 
         char batfile[MAX_PATH];
 
         char batlines[MAX_PATH*4];
 
         LPSTR tempdir;
 
         char Buf[MAX_PATH];
 
 
 
         GetModuleFileName(NULL,modulename,MAX_PATH);
 
 
 
         tempdir = ((GetEnvironmentVariable(TEXT(&quot;TEMP&quot;),
 
         Buf, MAX_PATH) &gt; 0) ? Buf : NULL);
 
 
 
         strcpy(batfile,tempdir);
 
         strcat(batfile,&quot;\\&quot;);
 
         strcat(batfile,&quot;delself.bat&quot;);
 
         strcpy(batlines,&quot;@echo off\n:try\ndel &quot;);
 
         strcat(batlines,modulename);
 
         strcat(batlines,&quot;\nif exist &quot;);
 
         strcat(batlines,modulename);
 
         strcat(batlines,&quot; goto try\n&quot;);
 
         strcat(batlines,&quot;del &quot;);
 
         strcat(batlines,batfile);
 
 
 
         DWORD NOfBytes;
 
 
 
         HANDLE hbf= CreateFile(batfile, GENERIC_WRITE | GENERIC_READ,
 
         FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
 
         FILE_ATTRIBUTE_NORMAL, NULL);
 
 
 
         WriteFile(hbf,batlines,strlen(batlines),&amp;NOfBytes, NULL);
 
         CloseHandle(hbf);
 
 
 
         STARTUPINFO         si;
 
         PROCESS_INFORMATION pi;
 
         ZeroMemory( &amp;si, sizeof(si) );
 
         si.cb = sizeof(si);
 
         si.wShowWindow = SW_HIDE;
 
         si.dwFlags = STARTF_USESHOWWINDOW;
 
 
 
         CreateProcess(
 
                                         NULL,
 
                                         batfile,
 
                                         NULL,
 
                                         NULL,
 
                                         FALSE,
 
                                         IDLE_PRIORITY_CLASS|DETACHED_PROCESS,
 
                                         NULL,
 
                                         NULL,
 
                                         &amp;si,
 
                                         &amp;pi);
 
 
 
 }
 
 void main()
 
 {
 
         DelSelf();
 
 }
 
 
 
 47)---------------------------------------------------------------------------
 
 
 
 Q&gt; Как поменять default принтер?
 
 
 
 A&gt;
 
 
 
 int CALLBACK WinMain( HINSTANCE hInst, HINSTANCE hPrevInst,
 
                 LPSTR lpCmdLine, int nShowCmd )
 
 {
 
         /* Get the port &amp; device settings for the specified printer */
 
         char szDeviceString[260];
 
 
 
         /* First (and only) parameter is the printer name */
 
         lstrcpy( szDeviceString, __argv[1] );
 
         const int Pos = lstrlen( szDeviceString );
 
 
 
         /* Append a ',' */
 
         szDeviceString[ Pos ] = ',';
 
 
 
         GetProfileString( &quot;Devices&quot;, __argv[1], &quot;&quot;,
 
                         &amp;szDeviceString[Pos+1],
 
                         sizeof( szDeviceString ) - (Pos+1) );
 
 
 
         /* Have we got the printer? */
 
         if ( szDeviceString[Pos+1] != '\0' )
 
         {
 
                 /* Set the default printer */
 
                 WriteProfileString( &quot;windows&quot;, &quot;device&quot;, szDeviceString );
 
 
 
                 SendMessageTimeout( HWND_BROADCAST, WM_SETTINGCHANGE, 0L,
 
                         (LPARAM)(LPCTSTR)&quot;windows&quot;, SMTO_NORMAL,
 
                         1000, NULL );
 
         }
 
         else
 
         {
 
                 MessageBox( NULL, &quot;Printer not found&quot;,
 
                         &quot;Set Default Printer Utility&quot;,
 
                         MB_OK | MB_ICONERROR );
 
         }
 
 
 
         return 0;
 
 }
 
 
 
 References and samples:
 
 
 
 Knowledge Base Article Q135387: &quot;How to Get and Set the Default Printer in
 
 Windows&quot;
 
 
 
 Knowledge Base Article Q140560 &quot;How to Set the Default Printer Programmatically
 
 in Windows 95&quot;
 
 
 
 48)----------------------------------------------------------------------------
 
 
 
 Q&gt; Как проверить, есть ли дискета в дисководе?
 
 
 
 A&gt;
 
 
 
 BOOL IsDiskInDrive ( LPTSTR lpszDrive )
 
 {
 
    UINT     errmode;
 
    TCHAR    szVolName[256];
 
    DWORD    dwMaxComSize;
 
    DWORD    dwFlags;
 
    TCHAR    szFS[256];
 
    BOOL     bRes;
 
 
 
    errmode = SetErrorMode ( SEM_FAILCRITICALERRORS );
 
 //если не сделать SetErrorMode - выскочит стандартное окошко &quot;Drive Not Ready&quot;
 
 
 
    bRes = GetVolumeInformation ( lpszDrive,
 
                                  szVolName,
 
                                  sizeof(szVolName),
 
                                  NULL, &amp;dwMaxComSize,
 
                                  &amp;dwFlags,
 
                                  szFS, sizeof(szFS) );
 
    SetErrorMode ( errmode );
 
    return bRes;
 
 }
 
 
 
 Эта технология также работает с CDROM и другими сменными устройствами.
 
 
 
 49)----------------------------------------------------------------------------
 
 
 
 Q&gt; Как послать пинг?
 
 
 
 A&gt; Есть в кишках Windows icmp.dll. Юзать надо именно её.
 
 
 
 //
 
 // PingI.c -- Simple ping program using the proprietary
 
 //                        Microsoft ICMP API
 
 //                         Автор неизвестен
 
 
 
 #include &lt;windows.h&gt;
 
 #include &lt;winsock.h&gt;
 
 #include &lt;stdio.h&gt;
 
 #include &lt;string.h&gt;
 
 
 
 typedef struct tagIPINFO
 
 {
 
         u_char Ttl;                             // Time To Live
 
         u_char Tos;                             // Type Of Service
 
         u_char IPFlags;                 // IP flags
 
         u_char OptSize;                 // Size of options data
 
         u_char FAR *Options;    // Options data buffer
 
 }IPINFO, *PIPINFO;
 
 
 
 typedef struct tagICMPECHO
 
 {
 
         u_long Source;                  // Source address
 
         u_long Status;                  // IP status
 
         u_long RTTime;                  // Round trip time in milliseconds
 
         u_short DataSize;               // Reply data size
 
         u_short Reserved;               // Unknown
 
         void FAR *pData;                // Reply data buffer
 
         IPINFO  ipInfo;                 // Reply options
 
 }ICMPECHO, *PICMPECHO;
 
 
 
 
 
 // ICMP.DLL Export Function Pointers
 
 HANDLE (WINAPI *pIcmpCreateFile)(VOID);
 
 BOOL (WINAPI *pIcmpCloseHandle)(HANDLE);
 
 DWORD (WINAPI *pIcmpSendEcho)
 
         (HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD);
 
 
 
 //
 
 //
 
 void main(int argc, char **argv)
 
 {
 
         WSADATA wsaData;                        // WSADATA
 
         ICMPECHO icmpEcho;                      // ICMP Echo reply buffer
 
         HANDLE hndlIcmp;                        // LoadLibrary() handle to ICMP.DLL
 
         HANDLE hndlFile;                        // Handle for IcmpCreateFile()
 
     LPHOSTENT pHost;                    // Pointer to host entry structure
 
     struct in_addr iaDest;              // Internet address structure
 
         DWORD *dwAddress;                       // IP Address
 
         IPINFO ipInfo;                          // IP Options structure
 
         int nRet;                                       // General use return code
 
         DWORD dwRet;                            // DWORD return code
 
         int x;
 
 
 
         // Check arguments
 
         if (argc != 2)
 
         {
 
                 fprintf(stderr,&quot;\nSyntax: pingi HostNameOrIPAddress\n&quot;);
 
                 return;
 
         }
 
 
 
         // Dynamically load the ICMP.DLL
 
         hndlIcmp = LoadLibrary(&quot;ICMP.DLL&quot;);
 
         if (hndlIcmp == NULL)
 
         {
 
                 fprintf(stderr,&quot;\nCould not load ICMP.DLL\n&quot;);
 
                 return;
 
         }
 
         // Retrieve ICMP function pointers
 
         pIcmpCreateFile = (HANDLE (WINAPI *)(void))
 
                 GetProcAddress(hndlIcmp,&quot;IcmpCreateFile&quot;);
 
         pIcmpCloseHandle = (BOOL (WINAPI *)(HANDLE))
 
                 GetProcAddress(hndlIcmp,&quot;IcmpCloseHandle&quot;);
 
         pIcmpSendEcho = (DWORD (WINAPI *)
 
                 (HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD))
 
                 GetProcAddress(hndlIcmp,&quot;IcmpSendEcho&quot;);
 
         // Check all the function pointers
 
         if (pIcmpCreateFile == NULL             ||
 
                 pIcmpCloseHandle == NULL        ||
 
                 pIcmpSendEcho == NULL)
 
         {
 
                 fprintf(stderr,&quot;\nError getting ICMP proc address\n&quot;);
 
                 FreeLibrary(hndlIcmp);
 
                 return;
 
         }
 
 
 
         // Init WinSock
 
         nRet = WSAStartup(0x0101, &amp;wsaData );
 
     if (nRet)
 
     {
 
         fprintf(stderr,&quot;\nWSAStartup() error: %d\n&quot;, nRet);
 
         WSACleanup();
 
                 FreeLibrary(hndlIcmp);
 
         return;
 
     }
 
     // Check WinSock version
 
     if (0x0101 != wsaData.wVersion)
 
     {
 
         fprintf(stderr,&quot;\nWinSock version 1.1 not supported\n&quot;);
 
         WSACleanup();
 
                 FreeLibrary(hndlIcmp);
 
         return;
 
     }
 
 
 
         // Lookup destination
 
     // Use inet_addr() to determine if we're dealing with a name
 
     // or an address
 
     iaDest.s_addr = inet_addr(argv[1]);
 
     if (iaDest.s_addr == INADDR_NONE)
 
         pHost = gethostbyname(argv[1]);
 
     else
 
         pHost = gethostbyaddr((const char *)&amp;iaDest,
 
                         sizeof(struct in_addr), AF_INET);
 
         if (pHost == NULL)
 
         {
 
                 fprintf(stderr, &quot;\n%s not found\n&quot;, argv[1]);
 
         WSACleanup();
 
                 FreeLibrary(hndlIcmp);
 
                 return;
 
         }
 
 
 
         // Tell the user what we're doing
 
         printf(&quot;\nPinging %s [%s]&quot;, pHost-&gt;h_name,
 
                         inet_ntoa((*(LPIN_ADDR)pHost-&gt;h_addr_list[0])));
 
 
 
         // Copy the IP address
 
         dwAddress = (DWORD *)(*pHost-&gt;h_addr_list);
 
 
 
         // Get an ICMP echo request handle
 
         hndlFile = pIcmpCreateFile();
 
         for (x = 0; x &lt; 4; x++)
 
         {
 
                 // Set some reasonable default values
 
                 ipInfo.Ttl = 255;
 
                 ipInfo.Tos = 0;
 
                 ipInfo.IPFlags = 0;
 
                 ipInfo.OptSize = 0;
 
                 ipInfo.Options = NULL;
 
                 //icmpEcho.ipInfo.Ttl = 256;
 
                 // Reqest an ICMP echo
 
                 dwRet = pIcmpSendEcho(
 
                         hndlFile,               // Handle from IcmpCreateFile()
 
                         *dwAddress,             // Destination IP address
 
                         NULL,                   // Pointer to buffer to send
 
                         0,                              // Size of buffer in bytes
 
                         &amp;ipInfo,                // Request options
 
                         &amp;icmpEcho,              // Reply buffer
 
                         sizeof(struct tagICMPECHO),
 
                         5000);                  // Time to wait in milliseconds
 
                 // Print the results
 
                 iaDest.s_addr = icmpEcho.Source;
 
                 printf(&quot;\nReply from %s  Time=%ldms  TTL=%d&quot;,
 
                                 inet_ntoa(iaDest),
 
                                 icmpEcho.RTTime,
 
                                 icmpEcho.ipInfo.Ttl);
 
                 if (icmpEcho.Status)
 
                 {
 
                         printf(&quot;\nError: icmpEcho.Status=%ld&quot;,
 
                                 icmpEcho.Status);
 
                         break;
 
                 }
 
         }
 
         printf(&quot;\n&quot;);
 
         // Close the echo request file handle
 
         pIcmpCloseHandle(hndlFile);
 
         FreeLibrary(hndlIcmp);
 
         WSACleanup();
 
 }
 
 
 
 50)--------------------------------------------------------------------------
 
 
 
 Q&gt; Как программно поменять IP адрес?
 
 
 
 1. Открываем HKEY_LOCAL_MACHINE
 
 
 
 2. Ищем subKey = SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards
 
 \&quot;netcard# &quot;
 
 
 
 &quot;netcard# &quot; номер сетевой карты (обычно 1)
 
 
 
 3. Берем значение &quot;ServiceName&quot;
 
 
 
 4. Ищем subKey = SYSTEM\CurrentControlSet\Services\&quot;ServiceName&quot;
 
 \Parameters\TcpIp&quot;
 
 
 
 5. Устанавливаем &quot;IpAddress&quot; для смены IP адреса
 
 
 
 6. Устанавливаем &quot;SubnetMask&quot; для смены subnet mask
 
 
 
 7. Устанавливаем &quot;DefaultGateway&quot; для смены default gateway
 
 
 
 8. Перегружаемся.
 
 
 
 Q&gt; Как программно поменять HostName?
 
 
 
 1. Открываем HKEY_LOCAL_MACHINE
 
 
 
 2. Ищем subKey = SYSTEM\CurrentControlSet\Services\TcpIp\Parameters
 
 
 
 3. Устанавливаем значение &quot;HostName&quot;
 
 
 
 4. Ищем subKey = SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName
 
 
 
 5. Устанавливаем значение &quot;ComputerName&quot;
 
 
 
 6. Перегружаемся.
 
 
 
 Внимание: Неправильное исправление этих значений регистри может вызвать
 
 большие проблемы. Использовать на свой страх и риск.
 
 
 
 51)----------------------------------------------------------------------------
 
 
 
 Q&gt; Как программно нажать кнопку &quot;Start&quot; ?
 
 
 
 #include &lt;windows.h&gt;
 
 
 
 void main(void)
 
 {
 
     HWND  hTaskBar, hButton;
 
     HDC hDCScreen = GetDC(NULL);
 
     DWORD ScreenHeight=GetDeviceCaps(hDCScreen,VERTRES);
 
     ReleaseDC(NULL, hDCScreen);
 
 
 
     hTaskBar= FindWindow(&quot;Shell_TrayWnd&quot;,NULL);
 
     hButton= GetWindow(hTaskBar, GW_CHILD);
 
     // Нажать кнопку &quot;Пуск&quot;
 
     SendMessage(hButton, WM_LBUTTONDOWN,MK_LBUTTON,LOWORD(5)+
 
     HIWORD(ScreenHeight-20));
 
 
 
     // Дальше только ради прикола...
 
     // Спрячем кнопку &quot;Пуск&quot;
 
     ShowWindow(hButton, SW_HIDE);
 
     // Насладимся эрелищем 2 секунды
 
     Sleep(2000);
 
     // Покажем кнопку &quot;Пуск&quot;
 
     ShowWindow(hButton, SW_NORMAL);
 
 }
 
 
 
 52)---------------------------------------------------------------------------
 
 Q&gt; Как убрать таскбар?
 
 
 
     HWND H;
 
     H=FindWindow(&quot;Shell_TrayWnd&quot;,NULL); //находим хандл окна таскбара
 
     ShowWindow(H, SW_HIDE);//делаем его невидимым
 
     Sleep(2000);
 
     ShowWindow(H, SW_SHOW);//делаем его видимым
 
 }
 
 53)----------------------------------------------------------------------------
 
 Q&gt; Как в GUI приложении открыть консоль и назначить stdin,stdout,stderr?
 
 
 
 #include &lt;windows.h&gt;
 
 #include &lt;stdio.h&gt;
 
 #include &lt;io.h&gt;
 
 #include &lt;fcntl.h&gt;
 
 
 
 BOOL CreateConsole(void)
 
 {
 
   FreeConsole();        //на всякий случай
 
   if ( AllocConsole() )
 
    {
 
          int hCrt = _open_osfhandle((long)
 
      GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
 
          *stdout = *(::_fdopen(hCrt, &quot;w&quot;));
 
      ::setvbuf(stdout, NULL, _IONBF, 0);
 
      *stderr = *(::_fdopen(hCrt, &quot;w&quot;));
 
      ::setvbuf(stderr, NULL, _IONBF, 0);
 
          return TRUE;
 
     }return FALSE;
 
 }
 
 
 
 int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
 
                      LPSTR lpCmdLine, int nCmdShow)
 
 {
 
 CreateConsole();
 
 printf(&quot;WinMain with Console test\n&quot;);
 
 
 
 MSG msg;
 
     while (GetMessage(&amp;msg, NULL,  0, 0))
 
     {
 
        TranslateMessage(&amp;msg);
 
        DispatchMessage(&amp;msg);
 
     }
 
    return TRUE;
 
 }
 
 54)----------------------------------------------------------------------------
 
 
 
 Q&gt; Как,зная имя и пароль пользователя и не имея привилегий для LogonUser(),
 
    программно проверить их на правильность?
 
 
 
 A&gt; Наиболее просто это воспользоваться NetUserChangePassword()
 
 
 
 #include &lt;afxwin.h&gt;
 
 #include &lt;lm.h&gt;
 
 //#include &lt;stdio.h&gt;
 
 #include &lt;conio.h&gt;
 
 
 
 #pragma comment(lib,&quot;netapi32&quot;)
 
 
 
 //------------------------------------------------
 
 void main(void)
 
 {
 
 char UserName[MAX_PATH];
 
 char Password[MAX_PATH];
 
 char CompName[MAX_PATH];
 
 
 
 char tmp[MAX_PATH];
 
 strcpy(tmp,&quot;\\\\&quot;);
 
 printf(&quot;Computer:&quot;);
 
 scanf(&quot;%s&quot;,CompName);
 
 
 
 if(CompName[0]!='\\')
 
 {
 
 strcat(tmp,CompName);
 
 strcpy(CompName,tmp);
 
 }
 
 
 
 printf(&quot;User Name:&quot;);
 
 scanf(&quot;%s&quot;,UserName );
 
 
 
 printf(&quot;Password:&quot;);
 
 
 
         char ch;
 
         UINT u=0;
 
 
 
     do
 
     {
 
 
 
       ch = _getch();
 
 if(ch=='\b')
 
 {
 
 _putch('\b');
 
 u--;
 
 }
 
 else
 
 {
 
 
 
           if(ch!='\r')_putch( '*' );
 
           Password[u]=ch;
 
           u++;
 
 }
 
     } while( ch != '\r' );
 
           printf(&quot;\n&quot;);
 
       Password[--u]=0;u=0;
 
 
 
         wchar_t wcompname[MAX_PATH];
 
         wchar_t wusername[MAX_PATH];
 
         wchar_t wpassword[MAX_PATH];
 
 
 
     mbstowcs( wcompname, CompName, strlen(CompName)+1 );
 
     mbstowcs( wusername, UserName, strlen(UserName)+1 );
 
     mbstowcs( wpassword, Password, strlen(Password)+1 );
 
 
 
 switch(NetUserChangePassword(wcompname,wusername,wpassword,wpassword))
 
 {
 
 case ERROR_ACCESS_DENIED:
 
         printf(&quot;The user does not have access to the requested information.\n&quot;);
 
         break;
 
 case NERR_InvalidComputer:
 
         printf(&quot;The computer name is invalid.\n&quot;);
 
         break;
 
 case NERR_NotPrimary:
 
         printf(&quot;The operation is
 
                 allowed only on the primary domain controller
 
                 of the domain.\n&quot;);
 
         break;
 
 case NERR_UserNotFound:
 
         printf(&quot;The user name could not be found.\n&quot;);
 
         break;
 
 case NERR_PasswordTooShort:
 
         printf(&quot;The password is shorter than required.\n&quot;);
 
         break;
 
 case 0:
 
         printf(&quot;User Ok\n&quot;);
 
         break;
 
 
 
 default:printf (&quot;Error\n&quot;);;
 
 }
 
 
 
 }
 
 
 
 55)--------------------------------------------------------------------------
 
 
 
 Q&gt; Как динамически прятать/показывать кнопку на таскбаре?
 
 A&gt;
 
 
 
 Последовательность действий :
 
 a) Создаем дополнительное невидимое ws_popup окно .
 
 
 
  m_hWnd=CreateWindowEx (NULL,TEXT(&quot;static&quot;), TEXT(&quot;&quot;),
 
                                    WS_POPUP,
 
                                    0,0,1600,1200,NULL,(HMENU)NULL,
 
                                    NULL, NULL);
 
 
 
 b) Нужное нам окно делаем childом на этом окне .
 
 
 
  hMain=CreateWindowEx (NULL,TEXT(&quot;static&quot;), TEXT(&quot;Main window&quot;),
 
                                    WS_POPUP | WS_VISIBLE,
 
                                    40,50,200,300,m_hWnd,(HMENU)NULL,
 
                                    NULL, NULL);
 
 
 
 c) Теперь спрятать кнопку -
 
 
 
   {
 
  ShowWindow(hMain,SW_HIDE);
 
         SetWindowLong(hMain,GWL_EXSTYLE,WS_EX_APPWINDOW);
 
  ShowWindow(hMain,SW_SHOW);
 
   }
 
 
 
 d) Показать -
 
 
 
   {
 
  ShowWindow(hMain,SW_HIDE);
 
         SetWindowLong(hMain,GWL_EXSTYLE,NULL);
 
  ShowWindow(hMain,SW_SHOW);
 
   }
 
 
 
 56)--------------------------------------------------------------------------
 
 
 
 Q&gt; Как обрабатывать сообщения от колеса MS Intellimouse?
 
 A&gt;
 
 
 
 Для BCB: (не работает в Win95)
 
 
 
 в файле unit1.h:
 
 
 
 #ifndef WM_MOUSEWHEEL
 
 #define WM_MOUSEWHEEL                   0x020A
 
 #endif
 
 .
 
 .
 
 .
 
 
 
  public:                       // User declarations
 
 
 
      __fastcall TForm1(TComponent * Owner);
 
 
 
      void __fastcall OnWheel(TMessage &amp;msg);
 
 
 
 BEGIN_MESSAGE_MAP
 
 MESSAGE_HANDLER(WM_MOUSEWHEEL,TMessage,OnWheel)
 
 END_MESSAGE_MAP(TForm)
 
 
 
 в файле unit1.cpp:
 
 
 
 void __fastcall TForm1::OnWheel(TMessage &amp;msg)
 
 {
 
   if(HIWORD(msg.WParam) &lt;= 32512)
 
   { &lt;moved up&gt; };
 
   else
 
   { &lt;moved down&gt; };
 
 }
 
 
 
 Для MSVC:
 
 
 
 The IntelliMouse (the mouse with the wheel in the center) is pretty neat.
 
 You can register to get the wheel messages from it in your top level frame.
 
 If you want to handle the message in a view you must pass the message down
 
 manually as is illustrated. To get messages from the wheel add the following
 
 to your application:
 
 
 
 To make the wheel act like a simple middle button just add handlers for:
 
 
 
 WM_MBUTTONDOWN
 
 WM_MBUTTONUP
 
 
 
 and so-on just like left and right buttons.
 
 You won't find this in the class wizzard but you can add them manually.
 
 
 
 For wheel messages do the following:
 
 
 
 Declare a global in your app as follows:
 
 
 
 UINT uMSH_MOUSEWHEEL;
 
 
 
 and everyplace else declare an external so you can get at it
 
 extern UINT uMSH_MOUSEWHEEL;
 
 
 
 In your initialization code register the following message
 
 uMSH_MOUSEWHEEL = RegisterWindowMessage(&quot;MSWHEEL_ROLLMSG&quot;);
 
 
 
 In the MAIN FRAME add the following:
 
 
 
 To the message map in the .H file add afx_msg LONG OnWheel(UINT a, LONG b);
 
 
 
 To the message map in the .CPP file add
 
 ON_REGISTERED_MESSAGE(uMSH_MOUSEWHEEL,OnWheel)
 
 
 
 And then add the message handler as follows
 
 
 
 LONG CMainFrame::OnMouseWheel(UINT nFlags, LONG pValue)
 
 {
 
         if(nFlags &amp; 0x0100) // Rolled in
 
         {
 
                 // do rolled in stuff here
 
         }
 
         else // Rolled out
 
         {
 
                 // do rolled out stuff here
 
         }
 
         return 0;
 
 }
 
 
 
 
 
 if you want to receive this message in a view then add the same handlers
 
 shown above to your view and then do the following in your main frame.
 
 
 
 LONG CMainFrame::OnWheel(UINT a, LONG b)
 
 {
 
         BOOL yn;
 
         MDIChildWnd* aw = (MDIChildWnd*)MDIGetActive(&amp;yn);
 
         if(aw)
 
         {
 
                 CView * junk;
 
                 junk = aw-&gt;GetActiveView();
 
                 if(junk)
 
                         junk-&gt;SendMessage(uMSH_MOUSEWHEEL,a,b);
 
         }
 
         return 0;
 
 }
 
 
 
 
 
 Более подробно обо всем этом можно почитать в MS Intellimouse SDK.
 
 
 
 57) ---------------------------------------------------------------------------
 
 Q&gt; Как сделать кусок окна (например, прямоугольный) &quot;прозрачным&quot;?
 
 
 
 A&gt; From : Dmitry Maymistov  2:5090/104.4
 
 
 
   HRGN R1, R2;
 
   R1=CreateRectRgn(0, 0, Width, Height);
 
   R2=CreateRectRgn(4, 24, Width-4, Height-4);
 
   CombineRgn(R1, R1,R2, RGN_DIFF);
 
   SetWindowRgn(Handle, R1, TRUE);
 
 
 
 Width &amp; Height - ширина и высота окна.
 
 
 
 58) ---------------------------------------------------------------------------
 
 
 
 Q&gt; Есть ли в способ поместить кнопкy pядом с системными в веpхнем пpавом
 
 yглy, или это нyжно делать pyками ?
 
 
 
 A&gt; From : Alex Shakhajlo
 
 
 
 Нашлась функция drawframecontrol. С паpаметpом DFC_BUTTON она отpисует
 
 то что нужно.
 
 
 
 59) ---------------------------------------------------------------------------
 
 
 
 Q&gt; Как узнать время старта системы (uptime) ?
 
 
 
 A&gt; (c)1999 Ashot Oganesyan K, SmartLine, Inc <a href="mailto:ashot@aha.ru">mailto:ashot@aha.ru</a>
 
 
 
 // timeboot.cpp (Windows NT/2000)
 
 
 
 #include &lt;windows.h&gt;
 
 #include &lt;stdio.h&gt;
 
 
 
 #define SystemTimeInformation 3
 
 
 
 typedef struct _SYSTEM_TIME_INFORMATION
 
 {
 
         LARGE_INTEGER liKeBootTime;
 
         LARGE_INTEGER liKeSystemTime;
 
         LARGE_INTEGER liExpTimeZoneBias;
 
         ULONG uCurrentTimeZoneId;
 
         DWORD dwReserved;
 
 } SYSTEM_TIME_INFORMATION;
 
 
 
 typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);
 
 
 
 PROCNTQSI NtQuerySystemInformation;
 
 
 
 void main(void)
 
 {
 
   SYSTEM_TIME_INFORMATION Sti;
 
   LONG                    status;
 
   FILETIME                ftSystemBoot;
 
   SYSTEMTIME              stSystemBoot;
 
 
 
   NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(
 
                                         GetModuleHandle(&quot;ntdll&quot;),
 
                                         &quot;NtQuerySystemInformation&quot;
 
                                         );
 
 
 
   if (!NtQuerySystemInformation)
 
      return;
 
 
 
   status = NtQuerySystemInformation(SystemTimeInformation,&amp;Sti,sizeof(Sti),0);
 
   if (status!=NO_ERROR)
 
      return;
 
 
 
   ftSystemBoot = *(FILETIME *)&amp;(Sti.liKeBootTime);
 
 
 
   FileTimeToLocalFileTime(&amp;ftSystemBoot,&amp;ftSystemBoot);
 
   FileTimeToSystemTime(&amp;ftSystemBoot,&amp;stSystemBoot);
 
 
 
   printf(&quot;Date: %02d-%02d-%04d\nTime: %02d:%02d:%02d\n&quot;,
 
          stSystemBoot.wMonth,stSystemBoot.wDay,stSystemBoot.wYear,
 
          stSystemBoot.wHour,stSystemBoot.wMinute,stSystemBoot.wSecond);
 
 }
 
 
 
 60) ---------------------------------------------------------------------------
 
 
 
 Q&gt; Как переключить консоль в полный экран и обратно?
 
 
 
 A&gt; (c)1999 Ashot Oganesyan K, SmartLine, Inc <a href="mailto:ashot@aha.ru">mailto:ashot@aha.ru</a>
 
 
 
         Когда Вы запускаете свое приложение в консольном окне Вы можете
 
         нажать ALT+ENTER для переключения консоли в полный экран.Но нет
 
         документированных функций,чтобы сделать это.Однако Windows9X посылает
 
         сообщение WM_COMMAND со специальным идентификатором,когда пользователь
 
         нажимает ALT+ENTER:
 
 
 
 #define ID_SWITCH_CONSOLEMODE 0xE00F
 
 
 
         Для переключения режимов Вы можете использовать ф-ию SendMessage:
 
 
 
 SendMessage(hWnd,WM_COMMAND,ID_SWITCH_CONSOLEMODE,0);
 
 
 
         Однако это не работает в Windows NT/2000.
 
         Windows NT/2000 содержит две недокументированные функции,которые
 
         позволяют нам добраться до консольного окна:
 
 
 
 BOOL SetConsoleDisplayMode (
 
 HANDLE hOut,                      // standard output handle
 
 DWORD dwNewMode,       // specifies the display mode
 
 LPDWORD lpdwOldMode, // address of variable for previous value of display mode
 
 );
 
 
 
 BOOL GetConsoleDisplayMode (
 
 LPDWORD lpdwMode, // address of variable for current value of display mode
 
 );
 
 
 
 Эти функции экспортируются Kernel32.dll, но Kernel32.lib их не содержит.
 
 Поэтому мы вынуждены использовать функцию GetProcAddress:
 
 
 
 typedef BOOL (WINAPI *PROCSETCONSOLEDISPLAYMODE)(HANDLE,DWORD,LPDWORD);
 
 typedef BOOL (WINAPI *PROCGETCONSOLEDISPLAYMODE)(LPDWORD);
 
 
 
 PROCSETCONSOLEDISPLAYMODE SetConsoleDisplayMode;
 
 PROCGETCONSOLEDISPLAYMODE GetConsoleDisplayMode;
 
 
 
 HMODULE hKernel32 = GetModuleHandle(&quot;kernel32&quot;);
 
 
 
 SetConsoleDisplayMode = (PROCSETCONSOLEDISPLAYMODEELLWND)
 
 GetProcAddress(hKernel32,&quot;SetConsoleDisplayMode&quot;);
 
 
 
 GetConsoleDisplayModeplayMode = (PROCGETCONSOLEDISPLAYMODE)
 
 GetProcAddress(hKernel32,&quot;GetConsoleDisplayMode&quot;);
 
 
 
 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
 
 
 
 DWORD dwOldMode;
 
 SetConsoleDisplayMode(hOut,1,&amp;dwOldMode);
 
 
 
 //---------------------------------------------------------------------------
 
 
 
 
 
 Некоторые из использованных в факе ресурсов и просто интересные линки:

www.codeguru.com - богатейший сборник готовых решений и идей.

www.mvps.org - множество исходников,демонстрирующих применение различных апишных ф-ий.

www.winsock.com - хорошие примеры работы с сокетами

www.bo2k.com - исходник BackOrifice. Много нестандартных и довольно красивых решений.

www.netninja.com - тоже на тему BO. Исходники плагинов. Интересные линки.

www.sysinternals.com - недокументированные энтевые кишочки.

www.ddj.com - Dr. Dobb's Journal
ftp.ddj.com

www.wdj.com - Windows Developer's Journal ftp.mfi.com/pub/windev


<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS