Главная > Программирование > Программирование в Windows > |
Win32 API FAQ |
Секция 2 из 3 - Предыдущая - Следующая
Все секции
- 1
- 2
- 3
itoa(binIp[0], dot, 10); strcat(result,dot); binIp[1] = (BYTE)((ipHO & 0x00ff0000) >> 16); itoa(binIp[1], dot, 10); strcat(result, "."); strcat(result, dot); binIp[2] = (BYTE)((ipHO & 0x0000ff00) >> 8); itoa(binIp[2], dot, 10); strcat(result, "."); strcat(result, dot); binIp[3] = (BYTE)(ipHO & 0x000000ff); itoa(binIp[3], dot, 10); strcat(result,"."); strcat(result, dot); strcat(result,"\r\n"); i++; } while ((pIpNO != NULL) && (iterations < 6)); WSACleanup(); PostQuitMessage(0); return; } 15)-------------------------------------------------------------------------- Q> Как определить тип Windows на компьютере? A> bool OsTypeNT(void) { OSVERSIONINFO vi; vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&vi); if (vi.dwPlatformId==VER_PLATFORM_WIN32_NT) return true; return false; } 16)-------------------------------------------------------------------------- Q> Как подключить сетевой диск? A> DWORD ConnectRemoteDrive(LPSTR ShareName,LPSTR LocalDrive) { NETRESOURCE nr; ZeroMemory(&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=""; nr.lpProvider=NULL; return WNetAddConnection2(&nr, // NETRESOURCE from enumeration (LPSTR) NULL, // no password (LPSTR) NULL, // logged-in user CONNECT_UPDATE_PROFILE); // update profile with connect info } 17)------------------------------------------------------------------------- Q> А как его отключить? A> WNetCancelConnection2(LPSTR LocalDrive,CONNECT_UPDATE_PROFILE,TRUE); 18)------------------------------------------------------------------------- Q> Как послать сообщение юзеру(а-ля net send) A> Вариант 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("\\\\computername\\mailslot\\messngr", GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hSlot != INVALID_HANDLE_VALUE) { char buf = "From\0\To\0Message\0"; uint cb = sizeof(buf); WriteFile(hSlot, buf, cb, &cb, NULL); CloseHandle(hSlot); } 19)-------------------------------------------------------------------------- Q> Как создать юзера и дать ему права? A> 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"Administrators"; lpszSystemInfo = tchBuffer2; ZeroMemory(&user_info,sizeof(user_info)); GetComputerName(lpszSystemInfo, &cchBuff); strcpy(compname,"\\\\"); strcat(compname,lpszSystemInfo); mbstowcs( wcompname, compname, strlen(compname)+1 ); mbstowcs(user_info.usri2_name,username, strlen(username)+1 ); //-------создаем юзера------------// user_info.usri2_password = L""; 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)&user_info, // input buffer &parm_err ); // parameter in error GetAccountSid( NULL, // default lookup logic username, // account to obtain SID &pSid // buffer to allocate to contain resultant SID ); NetLocalGroupAddMember(0,wGroupNameAdd,pSid); //---------даем ему кое-какие права-----------// OpenPolicy( wcompname, // target machine POLICY_ALL_ACCESS, &PolicyHandle // resultant policy handle ); SetPrivilegeOnAccount( PolicyHandle, // policy handle pSid, // SID to grant privilege L"SeInteractiveLogonRight", // Unicode privilege TRUE // enable the privilege ); SetPrivilegeOnAccount( PolicyHandle, pSid, L"SeNetworkLogonRight", TRUE ); LsaClose(PolicyHandle); return 0; } 20)-------------------------------------------------------------------------- Q> Как узнать какие пользователи есть на моей (или не моей) машине A> #define STRICT #include <windows.h> #include <lm.h> #include <iostream.h> #include <tchar.h> 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"\\\\PDC" ) ; //L"" ) ; while ( keepGoing ) { NET_API_STATUS ret = NetUserEnum( serverName, //NULL, 2, 0, //FILTER_NORMAL_ACCOUNT, (LPBYTE *)&pInfo, // Important: ADDRESS of POINTER sizeof( USER_INFO_2 ) * 100, // requested buffer size; &entriesRead, &totalEntries, &resumeHandle ) ; keepGoing = ( ret == ERROR_MORE_DATA ) ; if ( ret == 0 || ret == ERROR_MORE_DATA ) { DWORD i ; for ( i = 0 ; i < 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, "(no name!)" ) ; } else if ( lstrlenW( pName ) == 0 ) { lstrcpy( nameBuf, "(empty name!)" ) ; } else { WideCharToMultiByte( CP_ACP, 0, pName, -1, nameBuf, UNLEN, NULL, NULL ) ; } if ( pComm == NULL ) { lstrcpy( commentBuf, "(no comment!)" ) ; } else if ( lstrlenW( pComm ) == 0 ) { lstrcpy( commentBuf, "(empty comment!)" ) ; } else { WideCharToMultiByte( CP_ACP, 0, pComm, -1, commentBuf, MAXCOMMENTSZ, NULL, NULL ) ; } cout << nameBuf << ": " << commentBuf << endl ; } } else { cout << "NetUserEnum error " << ret << endl ; } if ( pInfo ) { NetApiBufferFree( pInfo ) ; pInfo = NULL ; } } } 21)---------------------------------------------------------------------------- Q> Кто по сети или локально шарится по моей(не моей)машине? A> //------------------------------------------------------ // Who.exe (c) 1999 Serge Andyk asvzzz@chat.ru // Usage "who [server]". 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 <windows.h> #include <lm.h> #include <stdio.h> #pragma hdrstop #pragma comment( lib, "netapi32.lib" ) #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( "Error %d: %s\n", err, msgbuf ); } //------------------------------------------------------- void PrintLocalUsers(LPWSTR server) { resumeh = 0; do { bufw = NULL; rc = NetWkstaUserEnum( (LPTSTR)server, 1, (LPBYTE*) &bufw, 2048, &read, &total, &resumeh ); if ( rc != ERROR_MORE_DATA && rc != ERROR_SUCCESS ) break; { for ( i = 0, curw = bufw; i < read; ++ i, ++ curw ) { printf( "%-12S %-15S %-12S \n", curw->wkui1_username, curw->wkui1_logon_domain, curw->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*)&buf, 2048, &read, &total, &resumeh ); if ( rc != ERROR_MORE_DATA && rc != ERROR_SUCCESS ) break; { for ( i = 0, cur = buf; i < read; ++ i, ++ cur ) { printf( "%-12S %-12S %-27S %-22S\n", cur->sesi502_username, cur->sesi502_cname, cur->sesi502_transport, cur->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**)&buff, 2048, &read, &total, &resumeh ); if ( rc != ERROR_MORE_DATA && rc != ERROR_SUCCESS ) break; for ( i = 0, curf = buff; i < read; ++ i, ++ curf ) { printf( "%-12S %-15S \n", curf->fi3_username, curf->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""); } else if ( argc == 2 ) { mbstowcs( server, argv[1],MAXLEN); } else { printf("Usage - who [server]"); exit(1); } printf("\nLocal users:\n"); PrintLocalUsers(server); printf("\nNet users:\n"); PrintNetUsers(server); printf("\nFiles(Pipes)\n"); PrintNetFiles(server); return 0; } 22)--------------------------------------------------------------------------- Q> Как в мультипроцессорной системе указать задаче на каком процессоре работать? A> HANDLE threadHandle = GetCurrentThread(); SetThreadIdealProcessor(threadHandle, 1); 23)--------------------------------------------------------------------------- Q> Как установить (узнать) приоритет процесса? A> { HANDLE procHandle = GetCurrentProcess(); if (!SetPriorityClass(procHandle, HIGH_PRIORITY_CLASS)) RET_ERR("SetPriorityClass"); DWORD priorityClass = GetPriorityClass(procHandle); ADD_STR("Priority Class is set to : "); switch(priorityClass) { case HIGH_PRIORITY_CLASS: ADD_STR("HIGH_PRIORITY_CLASS\r\n"); break; case IDLE_PRIORITY_CLASS: ADD_STR("IDLE_PRIORITY_CLASS\r\n"); break; case NORMAL_PRIORITY_CLASS: ADD_STR("NORMAL_PRIORITY_CLASS\r\n"); break; case REALTIME_PRIORITY_CLASS: ADD_STR("REALTIME_PRIORITY_CLASS\r\n"); break; default: ADD_STR("Unknown priority class\r\n"); } return result_buffer; } 24)--------------------------------------------------------------------------- Q> Как установить (узнать) приоритет нити? A> { HANDLE threadHandle = GetCurrentThread(); if (!SetThreadPriority(threadHandle, THREAD_PRIORITY_HIGHEST)) RET_ERR("SetThreadPriority"); int priority = GetThreadPriority(threadHandle); if (priority == THREAD_PRIORITY_ERROR_RETURN) RET_ERR("GetThreadPriority"); switch (priority) { case THREAD_PRIORITY_ABOVE_NORMAL: ADD_STR("THREAD_PRIORITY_ABOVE_NORMAL\r\n"); break; case THREAD_PRIORITY_BELOW_NORMAL: ADD_STR("THREAD_PRIORITY_BELOW_NORMAL\r\n"); break; case THREAD_PRIORITY_HIGHEST: ADD_STR("THREAD_PRIORITY_HIGHEST\r\n"); break; case THREAD_PRIORITY_IDLE: ADD_STR("THREAD_PRIORITY_IDLE\r\n"); break; case THREAD_PRIORITY_LOWEST: ADD_STR("THREAD_PRIORITY_LOWEST\r\n"); break; case THREAD_PRIORITY_NORMAL: ADD_STR("THREAD_PRIORITY_NORMAL\r\n"); break; case THREAD_PRIORITY_TIME_CRITICAL: ADD_STR("THREAD_PRIORITY_TIME_CRITICAL\r\n"); break; default: ADD_STR("Unknown\r\n"); } return result_buffer;} 25)--------------------------------------------------------------------------- Q> Как определить тип NT - server или workstation? A> Через регистри - HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\ProductOptions Значение "Product Type". Три возможных варианта : "WinNT" workstation "ServerNT" server "LanmanNT" domain controller 26)-------------------------------------------------------------------------- Q> Как проследить чтобы только одна копия приложения работала в данный момент A> 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 ("Some_Unique_Name_Or_Other")) { // Proceed } else { MessageBox (NULL,"Error","Error: app already running!",MB_OK|MB_ICONERROR); exit(1); } 27)--------------------------------------------------------------------------- Q> Имеется PID процесса,как узнать имя "process executable"? A> #include <psapi.h> #pragma comment(lib,"psapi.lib") //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), &dwNeeded)) { if (GetModuleBaseName (hProc, ahMod[0], szProcessName, sizeof(szProcessName))) { <success> } else { <failure> } } CloseHandle (hProc); } } 28)-------------------------------------------------------------------------- Q> Как извлечь версию EXE,DLL и т.д.? A> 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, &dwScratch); if (dwInfSize) { pbyInfBuff = new BYTE [dwInfSize]; memset (pbyInfBuff, 0, dwInfSize); if (pbyInfBuff) { if (GetFileVersionInfo (pszAppName, 0, dwInfSize, pbyInfBuff)) { if (VerQueryValue (pbyInfBuff, "\\VarFileInfo\\Translation", (void**)(&pdwLangChar), &uSize)) { if (VerLanguageName (LOWORD (*pdwLangChar), szResource, sizeof(szResource))) { strncpy (pszLangBuff, szResource, iLangBuffLen); } wsprintf (szResource, "\\StringFileInfo\\%04X%04X\\FileVersion", LOWORD (*pdwLangChar), HIWORD (*pdwLangChar)); if (VerQueryValue (pbyInfBuff, szResource, (void**)(&pszVersion), &uSize)) { strncpy (pszVerBuff, pszVersion, iVerBuffLen-1); } } } delete [] pbyInfBuff; } } } 29)--------------------------------------------------------------------------- Q> Как узнать имя дефолтового web browsera и , вообще, как узнать - с Q> какой программой ассоциирован данный тип файла (напр .HTM или .ZIP)? A> Создать временный .htm или .zip и использовать апишную FindExecutable 30)--------------------------------------------------------------------------- Q> Как удалить директорию,если она не пустая? A> SHFILEOPSTRUCT sh; sh.hwnd = GetSafeHwnd(); //Для BCB sh.hwnd=FormX->Handle; sh.wFunc = FO_DELETE; sh.pFrom = "c:\\test\0"; sh.pTo = NULL; sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT; sh.hNameMappings = 0; sh.lpszProgressTitle = NULL; SHFileOperation (&sh); Этот код выносит все дерево, начиная с (и включая) с:\test 31)---------------------------------------------------------------------------- Q> Как запретить переключение по alt-tab? A> Для 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->Handle, m_nHotKeyID, MOD_ALT, VK_TAB); } void __fastcall TForm1::FormDestroy(TObject *Sender) { BOOL m_iskeyUnregistered = UnregisterHotKey(Form1->Handle, m_nHotKeyID); } 32)---------------------------------------------------------------------------- Q> Как программно нажать клавишу (Num Lock например)? A> 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> Как соединиться по RAS ? A> #include <ras.h> #include <raserror.h> 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, &rdParams, 0L, NULL, &hRasConn ); if ( dwRet == 0 ) return true; char szBuf[256]; if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 ) wsprintf( (LPSTR)szBuf, "Undefined RAS Dial Error (%ld).", dwRet ); RasHangUp( hRasConn ); MessageBox( (LPSTR)szBuf, "Error", MB_OK | MB_ICONSTOP ); return false; } 34)---------------------------------------------------------------------------- Q> Как определить,имеется ли соединение по RAS? A> BOOL IsInternetConnected () { DWORD nRasDevices = 20; DWORD nSize = 20; RASCONN rasconnected [10]; // Ras Connected struct rasconnected[0].dwSize = sizeof(RASCONN); RasEnumConnections( rasconnected, &nSize, &nRasDevices ); return ( BOOL (nRasDevices) ); } Note:95 считает что соединение произошло,как только модем подымает трубу ;-) 35)-------------------------------------------------------------------------- Q> Как разорвать соединение? A> 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, &dSize, &dNumber ); if ( dwRet != 0 ) { if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 ) wsprintf( (LPSTR)szBuf, "Undefined RAS Enum Connections error (%ld).", dwRet ); MessageBox( (LPSTR)szBuf, "RasHangUp", MB_OK | MB_ICONSTOP ); return false; } bool bOK = true; for( DWORD dCount = 0; dCount < 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, "Undefined RAS HangUp Error (%ld).", dwRet ); MessageBox( (LPSTR)szBuf, "RasHangUp", MB_OK | MB_ICONSTOP ); bOK = false; } } return bOK; } 36)--------------------------------------------------------------------------- Q>Как узнать максимум информации о типе и возможностях ОС на удаленной машине A> NetServerGetInfo(LPTSTR servername,DWORD level,LPBYTE *bufptr); Откликаются все операционки производства MS и UNIXы с установленной самбой. Выдают о себе все что сами знают ;-) 37)---------------------------------------------------------------------------- Q> Как создать hard link на NTFS? A> #include <windows.h> #include <stdio.h> #pragma hdrstop #define err doerr( __FILE__, __LINE__ ) void doerr( const char *file, int line ) { DWORD e; e = GetLastError(); if ( e == 0 ) return; printf( "%s(%d): gle = %lu\n", file, line, e ); exit( 2 ); } void enableprivs() { HANDLE hToken; byte buf[sizeof TOKEN_PRIVILEGES * 2]; TOKEN_PRIVILEGES & tkp = *( (TOKEN_PRIVILEGES *) buf ); if ( ! OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) ) err; // берем SeBackupPrivilege и SeRestorePrivilege if ( !LookupPrivilegeValue( NULL, SE_BACKUP_NAME, &tkp.Privileges[0].Luid ) ) err; if ( !LookupPrivilegeValue( NULL, SE_RESTORE_NAME, &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, &tkp, sizeof tkp, NULL, NULL ); } int main( int argc, char *argv[] ) { HANDLE fh; if ( argc != 3 ) { printf( "usage: lnw {file} {new_link_name}\n" ); 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, &buf1[0], &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 *) &wsi, 20, &numwritten, FALSE, FALSE, &ctx ) )err; if ( numwritten != 20 ) err; if ( ! BackupWrite( fh, (byte *) buf2, wsi.Size.LowPart, &numwritten, FALSE, FALSE, &ctx ) )err; if ( numwritten != wsi.Size.LowPart )err; BackupWrite( fh, (byte *) &buf1[0], 0, &numwritten, TRUE, FALSE, &ctx ); CloseHandle( fh ); return 0; } 38)---------------------------------------------------------------------------- Q> Как "зашедулить" задачу ? A> #include <windows.h> #include <lm.h> #include <stdio.h> #include <stdlib.h> #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 <lmat.h> #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 < 2 || argc > 3 ) { puts( "usage: nsja [\\\\server] \"command\"" ); return 1; } if ( argc > 2 ) mbstowcs( server, argv[2], lenof( server ) ); else server[0] = L'\0'; mbstowcs( cmd, argv[argc - 1], lenof( cmd ) ); memset( &at, '\0', sizeof at ); at.Command = &cmd[0]; rc = NetScheduleJobAdd( server, (byte *) &at, &id ); if ( rc != ERROR_SUCCESS ) printf( "NSJA() returned %lu\n", rc ); return 0; } 39)---------------------------------------------------------------------------- Q> Как посмотреть,что же там уже "нашедулено"? A> #include <windows.h> #include <lm.h> #include <stdio.h> #include <stdlib.h> #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 <lmat.h> #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 > 2 ) { puts( "usage: nsje [\\\\server]" ); return 1; } if ( argc > 2 ) mbstowcs( server, argv[2], lenof( server ) ); else server[0] = L'\0'; hResume = 0; printf( "%8.8s %.70s\n", "JobId", "Command" ); printf( "%8.8s %.70s\n", "--------", "----------------------------------------------------------------------" ); goForIt = true; while ( goForIt ) { pBuf = NULL; rc = NetScheduleJobEnum( *server == L'\0'? NULL: server, (BYTE **) &pBuf, 8192, &nRead, &nLeftBeforeCall, &hResume ); if ( rc != ERROR_SUCCESS && rc != ERROR_MORE_DATA ) { printf( "Doh! rc = %lu\n", rc ); return 1; } for ( pJob = pBuf, i = 0; i < nRead; ++ i, ++ pJob ) { printf( "%8lu %.70S\n", pJob->JobId, pJob->Command ); } if ( pBuf != NULL ) NetApiBufferFree( pBuf ); if ( rc == ERROR_SUCCESS ) goForIt = false; } return 0; } 40)---------------------------------------------------------------------------- Q> Можно ли в 95 использовать функции Net*() (NetFileEnum и т.п.)? A> Можно. Вариант 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( ..., &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: "Michael L. Stepuchev" <stepuchev@prognoz.ru> Для Windows 95 есть что-то типа Administration Kit (лежит в WinNT Resource Kit). Вот там есть 2 dll-ины (radmin32.dll & rlocal32.dll), в которых описаны все или почти все функции NT-евой netapi32.dll. Надо юзать эти dll-ины. 41)---------------------------------------------------------------------------- Q> Как определить частоту процессора? A> WinNT: HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0\~Mhz 42)--------------------------------------------------------------------------- Q> Как узнать MAC адрес сетевой карты?
Секция 2 из 3 - Предыдущая - Следующая
Вернуться в раздел "Программирование в Windows" - Обсудить эту статью на Форуме |
Главная - Поиск по сайту - О проекте - Форум - Обратная связь |