Пишу простенький Socks5 прокси сервер. Всё вроде делаю правильно, но данные не идут как не крути =( в общем посмотрите на код, если будут какие соображения , говорите. []
Ну вот тебе пример: Код (Text): #include <windows.h> #include <stdio.h> #include "psapi.h" #pragma comment (lib, "psapi") #pragma comment (lib, "advapi32") #define _toi (__int64) #define _toui (unsigned __int64) #define LARGE_INTEGER unsigned __int64 #define LargeIntegerAdd(a,b) (LARGE_INTEGER)(_toi(a) + _toi(b)) #define LargeIntegerSubtract(a,b) (LARGE_INTEGER)(_toi(a) - _toi(b)) #define EnlargedIntegerMultiply(a,b) (LARGE_INTEGER)(_toi(a) * _toi(b)) #define EnlargedUnsignedMultiply(a,b) (LARGE_INTEGER)(_toui(a) * _toui(b)) #define ExtendedIntegerMultiply(a,b) (LARGE_INTEGER)(_toi(a) * _toi(b)) #define MAX_PROCESSES (2048) unsigned __int64 LargeIntegerDivide ( unsigned __int64 i1, unsigned __int64 i2, unsigned __int64 *rem) { if (i2) if (rem) *rem = i1 % i2; if (i2) return (i1 / i2); return (0); /* ??? */ } typedef struct _PROCESS_TIME { DWORD dwProcessId; LARGE_INTEGER ProcessTime; LARGE_INTEGER SystemTime; int iUsage; int IsGarbage; } PROCESS_TIME; 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 ); } int get_cpu_usage_by_pid(PROCESS_TIME *pt) { unsigned __int64 ftKernelTime, ftUserTime, ftCreationTime, ftExitTime, ftSystemTime, tProcessTime, tSystemTime, ProcessTime, SystemTime, LargeInteger, Remainder; HANDLE hProcess; if (!pt) return (0); if (pt->dwProcessId == 0 /* Idle Process */) { pt->IsGarbage = 0; pt->iUsage = 0; return (0); } hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pt->dwProcessId); /* error, exited process? */ if (!hProcess) { pt->IsGarbage = 1; return (-1); } if (!GetProcessTimes(hProcess, (FILETIME*)&ftCreationTime, (FILETIME*)&ftExitTime, (FILETIME*)&ftKernelTime, (FILETIME*)&ftUserTime)) { pt->IsGarbage = 1; return (-1); } /* if process exit */ if (ftExitTime) { pt->IsGarbage = 1; return (1); } GetSystemTimeAsFileTime((FILETIME*)&ftSystemTime); ProcessTime = ftUserTime + ftKernelTime; SystemTime = ftSystemTime; tProcessTime = ProcessTime; tSystemTime = SystemTime; if (pt->ProcessTime && pt->SystemTime) { ProcessTime = ProcessTime - pt->ProcessTime; SystemTime = SystemTime - pt->SystemTime; ProcessTime = ExtendedIntegerMultiply(ProcessTime, 100); LargeInteger = LargeIntegerDivide(ProcessTime, SystemTime, &Remainder); pt->iUsage = LargeInteger; pt->ProcessTime = tProcessTime; pt->SystemTime = tSystemTime; } else { pt->ProcessTime = ProcessTime; pt->SystemTime = SystemTime; pt->iUsage = 0; /* ? */ } pt->IsGarbage = 0; return (0); } PROCESS_TIME* lsys_get_pt_by_pid(PROCESS_TIME *pt, int size, int pid) { int msize; PROCESS_TIME *ptime; ptime = pt; for (msize = 0; msize < size; msize++) { if (ptime->dwProcessId == pid) { ptime->IsGarbage = 1; return ptime; } ptime++; } ptime = pt; for (msize = 0; msize < size; msize++) { if (ptime->dwProcessId == -1UL) { ptime->dwProcessId = pid; ptime->ProcessTime = 0; ptime->SystemTime = 0; ptime->iUsage = 0; ptime->IsGarbage = 1; return ptime; } ptime++; } return (0); } int lsys_get_cpu_usage(PROCESS_TIME *pt, int size) { DWORD aProcesses[MAX_PROCESSES], cbNeeded, cProcesses; unsigned int i; MEMORYSTATUSEX ms; char *p; PROCESS_TIME *tpt; int msize; int cpuusage; if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) return 0; cProcesses = cbNeeded / sizeof(DWORD); for (i = 0; i < cProcesses; i++) { tpt = lsys_get_pt_by_pid(pt, size, aProcesses[i]); get_cpu_usage_by_pid(tpt); } tpt = pt; cpuusage = 0; for (msize = 0; msize < size; msize++) { if (tpt->IsGarbage) { tpt->dwProcessId = -1UL; tpt->ProcessTime = 0; tpt->SystemTime = 0; tpt->iUsage = 0; } else cpuusage += tpt->iUsage; tpt++; } return (cpuusage); } int main() { PROCESS_TIME *pt, *tpt; int psize; int i; psize = MAX_PROCESSES; pt = (PROCESS_TIME*) malloc(sizeof(PROCESS_TIME) * psize); if (!pt) { printf("can't allocate memory\n"); return (-1); } getDebugPriv(); tpt = pt; for (i = 0; i < psize; i++) { tpt->dwProcessId = -1; tpt->ProcessTime = 0; tpt->SystemTime=0; tpt->iUsage = 0; tpt->IsGarbage = 1; tpt++; } // _asm int 3 for ( ; ; ) { printf("%d\n", lsys_get_cpu_usage(pt, psize) / 2 /* num of cpu */); Sleep(1000); } return (0); } И ты думаешь, что это вставленное мною говно кто-то будет разбирать? Это, ксати, просто тест-сорец. Локализуй ошибки, сформулируй вопросы. Точнее нет, не так, во: Чем больше код, тем меньше помогающих.
Есть не законченный кусок кода на эту тему все пашет за исключением авторизации. Ну еще под никсы что бы собрать нужно кое что добавить а так могу отдать ...