faqs.org.ru

 Главная > Программирование > Программирование в Windows >

Win32 API FAQ

Секция 1 из 3 - Предыдущая - Следующая
Все секции - 1 - 2 - 3

              Win32 API FAQ (C)1999-2000 Serge Andyk (Сергей Андык)
                                2:5005/58.43
                             asvzzz@netcity.ru


        Если Вы хотите что-то добавить, а тем более обнаpyжили ошибкy (в том
 чиcле оpфогpафическyю/синтаксичекyю, то обязательно напишите мне по  адpесy
 2:5005/58.43 или asvzzz@netcity.ru

 Версия 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 процесса,как узнать имя "process executable"?
  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) Как "зашедулить" задачу ?
  39) Как посмотреть,что же там уже "нашедулено"?
  40) Можно ли в 95 использовать функции Net*() (NetFileEnum и т.п.)?
  41) Как определить частоту процессора?
  42) Как узнать MAC адрес сетевой карты?
  43) Как сделать, чтобы мою прогу нельзя было бы убить?
  44) Как узнать хэндл консольного окна?
  45) Как активизировать любое окно(передать ему фокус ввода)?
  46) Как стереть самого себя?
  47) Как поменять default принтер?
  48) Как проверить, есть ли дискета в дисководе?
  49) Как послать пинг?
  50) Как программно поменять IP адрес? А HostName?
  51) Как программно нажать кнопку "Start" ?
  52) Как убрать таскбар?
  53) Как в GUI приложении открыть консоль и назначить stdin,stdout,stderr?
  54) Как,зная имя и пароль пользователя и не имея привилегий для LogonUser(),
      программно проверить их на правильность?
  55) Как динамически прятать/показывать кнопку на таскбаре?
  56) Как обрабатывать сообщения от колеса MS Intellimouse?
* 57) Как сделать кусок окна (например, прямоугольный) "прозрачным"?
* 58) Есть ли в способ поместить кнопкy pядом с системными в веpхнем пpавом
      yглy, или это нyжно делать pyками?
* 59) Как узнать время старта системы (uptime)?
* 60) Как переключить консоль в полный экран и обратно?

Links

1)----------------------------------------------------------------------------

 Q> Как определить,принадлежит ли юзер группе администраторов?
 A> Два метода в одном флаконе:

#include <windows.h>
#include <stdio.h>
#include <lm.h>
#pragma hdrstop

#pragma comment( lib, "netapi32.lib" )

// My thanks to Jerry Coffin (jcoffin@taeus.com)
// 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, &size);

 rc = NetUserGetInfo( NULL, user_name, 1, (byte **) &info );
 if ( rc != NERR_Success )
  return false;

 result = info->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& groupList = *( (TOKEN_GROUPS *) rawGroupList );

 if ( ! OpenThreadToken( GetCurrentThread(), TOKEN_QUERY, FALSE, &hTok ) )
 {
  printf( "Cannot open thread token, trying process token [%lu].\n",
   GetLastError() );
  if ( ! OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY, &hTok ) )
  {
   printf( "Cannot open process token, quitting [%lu].\n",
    GetLastError() );
   return 1;
  }
 }

 // normally, I should get the size of the group list first, but ...
 l = sizeof rawGroupList;
 if ( ! GetTokenInformation( hTok, TokenGroups, &groupList, l, &l ) )
 {
  printf( "Cannot get group list from token [%lu].\n",
   GetLastError() );
  return 1;
 }

 // here, we cobble up a SID for the Administrators group, to compare to.
 if ( ! AllocateAndInitializeSid( &ntAuth, 2, SECURITY_BUILTIN_DOMAIN_RID,
  DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &pAdminSid ) )
 {
  printf( "Cannot create SID for Administrators [%lu].\n",
   GetLastError() );
  return 1;
 }

 // now, loop through groups in token and compare
 found = 0;
 for ( i = 0; i < 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( "NetUserGetInfo(): The current user is %san Administrator.\n",
  j? "": "not " );
 printf( "Process token: The current user is %sa member of the Administrators
group.\n",
  l? "": "not " );

 return 0;
}


2)----------------------------------------------------------------------------

 Q> Как узнать какие привилегии есть у пользователя ?
 A>

#include <windows.h>
#include <stdio.h>
#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, &hToken ) )
 {
  puts( "OpenProcessToken" );
  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, &dwInfoBufferSize);

 printf( "Account privileges: \n\n" );
 for( i = 0; i < ptgPrivileges->PrivilegeCount; i ++ )
 {
  dwPrivilegeNameSize = sizeof ucPrivilegeName;
  dwDisplayNameSize = sizeof ucDisplayName;
  LookupPrivilegeName( NULL, &ptgPrivileges->Privileges[i].Luid,
   ucPrivilegeName, &dwPrivilegeNameSize );
  LookupPrivilegeDisplayName( NULL, ucPrivilegeName,
   ucDisplayName, &dwDisplayNameSize, &dwLangId );
  printf( "%40s (%s)\n", ucDisplayName, ucPrivilegeName );
 }

}

3)----------------------------------------------------------------------------

 Q> Как узнать SID юзера?
 A> Из исходника 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
                    &cbSid,             // size of SID
                    ReferencedDomain,   // domain account was found on
                    &cbReferencedDomain,
                    &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> Как SID привести к текстовому виду(например для загрузки HKEY_USERS)?
 A> См.исходник:

// 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 < size )
 {
  SetLastError( ERROR_INSUFFICIENT_BUFFER );
  return FALSE;
 }

 // Add 'S' prefix and revision number to the string.

 size = wsprintf( buf, "S-%lu-", dwSidRev );
 p = buf + size;

 // Add SID identifier authority to the string.

 if ( psia->Value[0] != 0 || psia->Value[1] != 0 )
 {
  n = wsprintf( p, "0x%02hx%02hx%02hx%02hx%02hx%02hx",
  (USHORT) psia->Value[0], (USHORT) psia->Value[1],
  (USHORT) psia->Value[2], (USHORT) psia->Value[3],
  (USHORT) psia->Value[4], (USHORT) psia->Value[5] );
  size += n;
  p += n;
 }
 else
 {
  n = wsprintf( p, "%lu", ( (ULONG) psia->Value[5] ) +
  ( (ULONG) psia->Value[4] << 8 ) + ( (ULONG) psia->Value[3] << 16 ) +
  ( (ULONG) psia->Value[2] << 24 ) );
  size += n;
  p += n;
 }

 // Add SID subauthorities to the string.

 for ( i = 0; i < dwSubAuthorities; ++ i )
 {
  n = wsprintf( p, "-%lu", *GetSidSubAuthority( ps, i ) );
  size += n;
  p += n;
 }

 return TRUE;
}

5)----------------------------------------------------------------------------

 Q> Как дать(забрать)привилегии?
 A> (c)"Getadmin"

#include <ntsecapi.h>
#include <lmaccess.h>


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(&PrivilegeString, PrivilegeName);//см.ниже

    //
    // grant or revoke the privilege, accordingly
    //
    if(bEnable) {
        return LsaAddAccountRights(
                PolicyHandle,       // open policy handle
                AccountSid,         // target SID
                &PrivilegeString,   // privileges
                1                   // privilege count
                );
    }
    else {
        return LsaRemoveAccountRights(
                PolicyHandle,       // open policy handle
                AccountSid,         // target SID
                FALSE,              // do not disable all rights
                &PrivilegeString,   // privileges
                1                   // privilege count
                );
    }
}

6)----------------------------------------------------------------------------

 Q>  А как для вышеприведенного фрагмента получить хэндл полиси???
 A>

#include <ntsecapi.h>
#include <lmaccess.h>

void
InitLsaString(
    PLSA_UNICODE_STRING LsaString,
    LPWSTR String
    )
{
    DWORD StringLength;

    if (String == NULL) {
        LsaString->Buffer = NULL;
        LsaString->Length = 0;
        LsaString->MaximumLength = 0;
        return;
    }

    StringLength = wcslen(String);
    LsaString->Buffer = String;
    LsaString->Length = (USHORT) StringLength * sizeof(WCHAR);
    LsaString->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(&ObjectAttributes, sizeof(ObjectAttributes));

    if (ServerName != NULL) {
        //
        // Make a LSA_UNICODE_STRING out of the LPWSTR passed in
        //
        InitLsaString(&ServerString, ServerName);
        Server = &ServerString;
    }

    //
    // Attempt to open the policy.
    //
    return LsaOpenPolicy(
                Server,
                &ObjectAttributes,
                DesiredAccess,
                PolicyHandle
                );
}

7)---------------------------------------------------------------------------

 Q> Как взять себе привилегию?
 A> Например берем привилегию отладки программ:

void getDebugPriv( void )
{
 HANDLE hToken;
 LUID sedebugnameValue;
 TOKEN_PRIVILEGES tkp;

 if ( ! OpenProcessToken( GetCurrentProcess(),
  TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
  return;

 if ( !LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &sedebugnameValue ) )
 {
  CloseHandle( hToken );
  return;
 }

 tkp.PrivilegeCount = 1;
 tkp.Privileges[0].Luid = sedebugnameValue;
 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

 AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL );

 CloseHandle( hToken );
}

8)----------------------------------------------------------------------------

 Q> Как  включить/выключить аудит?
 A>

#include <windows.h>
#include <stdio.h>
#include <ntsecapi.h>
#pragma hdrstop

// This code was kindly provided by Marc Esipovich, marc@mucom.co.il.
// The original filename was "isauditon.c".
// 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 = &sqos;

 nts = LsaOpenPolicy(
     NULL, // NULL = current machine.
     &lsaOA,
     POLICY_VIEW_LOCAL_INFORMATION | GENERIC_READ | GENERIC_EXECUTE |
POLICY_ALL_ACCESS,
     &polHandle);
 if (nts != 0) return -1;


 nts = LsaQueryInformationPolicy(
       polHandle,
       PolicyAuditEventsInformation,
       &ppadi);
 if (nts != 0) return -1;

 if ( forceAuditOn )
 {
  // set policies
  ppadi->DomainName.Buffer[0] = 3;  // restart_shutdown_and_system
  ppadi->DomainName.Buffer[2] = 3;  // logon_and_logoff
  ppadi->DomainName.Buffer[4] = 3;  // file_and_object_access
  ppadi->DomainName.Buffer[6] = 3;  // use_of_user_rights
  ppadi->DomainName.Buffer[8]  = 3; // process_tracking
  ppadi->DomainName.Buffer[10] = 3; // security_policy_changes
  ppadi->DomainName.Buffer[12] = 3; // user_and_group_management

  ppadi->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( "Auditing has been enabled." );
 else if ( rc == 0 )
  puts( "The audit state is unchanged." );
 else
  puts( "Oops!" );

 return 0;
}

9)---------------------------------------------------------------------------

 Q> Как грохнуть процесс(в том числе системный)?
 A>

#include <windows.h>
#include <stdio.h>
#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 < argc; i ++ )
 {
  if ( pidCount == lenof( pid ) ) {
   errors ++;
   break;
  }

  pid[pidCount] = strtol( argv[i], &p, 0 );
  if ( p == argv[i] || *p )
   errors ++;
  else
   pidCount ++;
 }

 if ( errors || pidCount == 0 )
 {
  puts( "Usage: fkill pid [...]" );
  puts( "fkill tries to kill the processes specified by the PIDs. If the" );
  puts( "user has debug privileges, fkill is able to kill system processes." );
  puts( "PIDs may be decimal, octal (starts with 0), or hex (starts with 0x)."
);
  return MAXPID + 1;
 }

 // try to acquire SeDebugPrivilege
 getDebugPriv(); //см. faq выше

 errors = 0;
 // for each PID:
 for ( i = 0; i < pidCount; i ++ )
 {
  printf( "pid %lu: ", pid[i] );

  // open process
  hProcess = OpenProcess( PROCESS_TERMINATE, FALSE, pid[i] );
  if ( isBadHandle( hProcess ) )
   printf( "OpenProcess() failed, err = %lu\n", GetLastError() );
  else
  {
   // kill process
   if ( ! TerminateProcess( hProcess, (DWORD) -1 ) )
    printf( "TerminateProcess() failed, err = %lu\n", GetLastError() );
   else
    puts( "killed." );

   // close handle
   CloseHandle( hProcess );
  }
 }

 return 0;
}

10)---------------------------------------------------------------------------

 Q> Как поставить system-wide хук(например писать в файл все нажатия кнопок)
 A>

Для этого хук должен жить в длл.

текст 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,"\\kbdkeys.txt");

   }
        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,&lParam,4);
kdown=!(aa[3]&&64);
BYTE scancode=aa[2];
BYTE ww[4];
memcpy(ww,&wParam,4);

if (code<0)return CallNextHookEx(NULL,code,wParam,lParam);

if(kdown&&(wParam==VK_SHIFT))shift=true;

if(!kdown&&(wParam==VK_SHIFT))shift=false;

if (kdown&&(wParam!=VK_SHIFT))
{
sprintf( buffer ,"%c",wParam );
if(isalpha(ww[0])&(!shift))wParam=wParam+32;
sprintf( buffer ,"%c",wParam );
if(wParam==VK_RETURN)strcpy(buffer,"\n");

   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),&NOfBytes,&ovlp);

  CloseHandle(LFile);
}
 return CallNextHookEx(NULL,code,wParam,lParam);
}
//----------------------------------------------------------------------//
текст приложения:

#include <commdlg.h>
#include <stdlib.h>
#include <winnls.h>

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("kbdh.dll"))) //вышеприведенная длл
            {
                return FALSE;
            }
        }

        if (!hhkKbdHook)
        {
         if (!(hhkKbdHook =
  SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)
  GetProcAddress((HINSTANCE)hmodHook,"KeyboardProc"),(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,"zad","zad",MB_OK);
    MSG   msg;

  while (GetMessage (&msg, NULL, 0, 0))
  {
        TranslateMessage (&msg);
        DispatchMessage (&msg);
  }
 return( 0 );
}

11)---------------------------------------------------------------------------

 Q> Как зашутдаунить удаленный компьютер?
 A>

int main(int argc, char **argv)
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
//-------------------
 char *name="";    // address of name of computer to shut down
 char *msg="";     //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,
&hToken);

    if(!LookupPrivilegeValue(name, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid)){
    printf ("SE_SHUTDOWN_NAME Privilege облом \n");
    return 1 ;};

    tkp.PrivilegeCount =1;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);

    if(!LookupPrivilegeValue(name,
SE_REMOTE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid)){
    printf("SE_REMOTE_SHUTDOWN_NAME Privilege облом \n");
    return 2 ;};

    tkp.PrivilegeCount =1;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);

    if (InitiateSystemShutdown(name,msg,time,force,reboot))
    printf("%s shutdown Ok\n",name);
    else printf("Can't shutdown %s \n",name);

 return 0;
}

12)----------------------------------------------------------------------------

 Q> Как сделать чтобы окошко не появлялось на таскбаре?
 A>

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. "Great",
say you, "but my app is dialog based, so what now Mr Smarty ?". 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> Как запустить(придушить) скринсэйвер
 A>

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("Screen-saver"),
                       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 ("WindowsScreenSaverClass"). 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 ("WindowsScreenSaverClass", 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,&bSaver,0))
   {
      if (bSaver)
      {
         ::PostMessage (::GetForegroundWindow(), WM_CLOSE, 0L, 0L);
      }
   }

So you can try that one as well. An embarassment of riches !

14)--------------------------------------------------------------------------

 Q> Как узнать ip адрес(а) машины (в текстовом виде)?
 A> Кусок исходника от плугина к BackOrifice:

//---------------------------------------------------
void MachineIP(char *result)
{
      WSADATA WSAData;

      WSAStartup(MAKEWORD(1,1), &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("%d %s",iResult,szHostName);
 if ((iResult != 0) || (lstrcmp(szHostName, "")==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->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,"z","x",MB_OK);
  ipHO = ntohl(*pIpNO);

  binIp[0] = (BYTE)((ipHO & 0xff000000) >> 24);

Секция 1 из 3 - Предыдущая - Следующая

Вернуться в раздел "Программирование в Windows" - Обсудить эту статью на Форуме
Главная - Поиск по сайту - О проекте - Форум - Обратная связь

© faqs.org.ru