Go Back   FlashFXP Forums > >

Programming Need help with C/C++/Delphi? Ask here and make us all laugh.

Closed Thread
 
Thread Tools Rate Thread Display Modes
Old 09-16-2003, 01:53 PM   #1
Mouton
Posse Member
Ultimate Scripter
ioFTPD Administrator
 
Join Date: Dec 2002
Posts: 1,956
Default ONLINEDATATA Usage example

Here's what i use to access the ONLINEDATA for sitewho...

The format i printf is the format needed for ioBMonitor btw, just in case u'd want to make a compatible command!

Code:
// SHMEM
#include <ServerLimits.h>
#include <VFS.h>
#include <Userfile.h>
#include <WinMessages.h>
#include <DataCopy.h>
#include "ioMessages.h"

LRESULT			lResult;
HWND			Target;
HANDLE			(WINAPI *ShMem_Allocate)(LPVOID, ULONG, DWORD);
LPVOID			(WINAPI *ShMem_Lock)(HANDLE, DWORD);
BOOL			(WINAPI *ShMem_Unlock)(LPVOID);
BOOL			(WINAPI *ShMem_Free)(HANDLE, DWORD);
LPDC_MESSAGE	lpMessage;
HMODULE			hShell32;
HANDLE			hSharedMemory, hEvent;
LPVOID			lpContext, hMemory;
DWORD			dwProcessId, dwAllocationSize;
DWORD			dwReturn;
HWND			hIoFTPD;

int initSharedMem(DWORD dwAllocationAsked=4096);
int closeSharedMem();

int initSharedMem(DWORD dwAllocationAsked)
{
	hEvent = INVALID_HANDLE_VALUE;
	lpMessage = NULL;
	hSharedMemory = NULL;
	hShell32 = LoadLibrary("shell32.dll");
	hIoFTPD	= FindWindow("ioFTPD::MessageWindow", NULL);
	dwProcessId	= GetCurrentProcessId();
	if (!hIoFTPD)
		return false;

	// Determinate amount of memory to allocate for vfs reader
	if (dwAllocationSize < dwAllocationAsked + sizeof(DC_MESSAGE))	//	Compare against amount of memory needed for shmem
		dwAllocationSize = dwAllocationAsked + sizeof(DC_MESSAGE);

	if (hShell32) {
		// Get shared memory functions
		/*
		ShMem_Allocate	= (HANDLE (WINAPI *)(LPVOID, ULONG, DWORD))GetProcAddress(hShell32, "SHAllocShared");
		ShMem_Free		= (BOOL (WINAPI *)(HANDLE, DWORD))GetProcAddress(hShell32, "SHFreeShared");
		ShMem_Unlock	= (BOOL (WINAPI *)(LPVOID))GetProcAddress(hShell32, "SHUnlockShared");
		ShMem_Lock		= (LPVOID (WINAPI *)(HANDLE, DWORD))GetProcAddress(hShell32, "SHLockShared");
		*/
		ShMem_Allocate	= (HANDLE (WINAPI *)(LPVOID, ULONG, DWORD))GetProcAddress(hShell32, (char *)520);
		ShMem_Free		= (BOOL (WINAPI *)(HANDLE, DWORD))GetProcAddress(hShell32, (char *)523);
		ShMem_Unlock	= (BOOL (WINAPI *)(LPVOID))GetProcAddress(hShell32, (char *)522);
		ShMem_Lock		= (LPVOID (WINAPI *)(HANDLE, DWORD))GetProcAddress(hShell32, (char *)521);

		if (ShMem_Allocate && ShMem_Free && ShMem_Lock && ShMem_Unlock)
		{
			// Shared memory exists - allocate memory
			hSharedMemory = ShMem_Allocate(NULL, dwAllocationSize, dwProcessId);
			if (hSharedMemory == INVALID_HANDLE_VALUE)
				return false;
			// Create event
			if ((hEvent = CreateEvent(NULL, FALSE, FALSE, NULL)) == INVALID_HANDLE_VALUE) 
				return false;
			lpMessage = (LPDC_MESSAGE)ShMem_Lock(hSharedMemory, dwProcessId);	// Lock allocation
		}
	}
	// Allocation failed
	if (!lpMessage)
		return false;

	//	Copy Message id
	lpMessage->hEvent		= hEvent;
	lpMessage->lpMemoryBase	= lpMessage;
	lpMessage->lpContext	= (LPVOID)((ULONG)lpMessage + sizeof(DC_MESSAGE));

	//	Send initialization message
	hMemory	= (LPVOID)SendMessage(hIoFTPD, WM_SHMEM_ALLOC, (WPARAM)dwProcessId, (LPARAM)hSharedMemory);
	
	if (!hMemory)	//	Verify handle
		return false;

	return true;
}

int closeSharedMem()
{
	//	Free shared memory
	if (hSharedMemory)
	{
		if (hMemory) SendMessage(hIoFTPD, WM_SHMEM_FREE, NULL, (LPARAM)hMemory);
		if (lpMessage) ShMem_Unlock(lpMessage);
		ShMem_Free(hSharedMemory, dwProcessId);
	}
	if (hEvent != INVALID_HANDLE_VALUE) CloseHandle(hEvent);
	if (hShell32) FreeLibrary(hShell32);

	return true;
}

void main (...)
{
	int iPos = 0, nPos = 0, Users = 0;
	
	if (!initSharedMem())
		exit(1);
	while (nPos != -1 && Users < 1000 ) {
		// Initial setup for DC_GET_ONLINEDATA
		lpMessage->dwIdentifier	= DC_GET_ONLINEDATA;
		PDC_ONLINEDATA pOnlineData = (PDC_ONLINEDATA)lpMessage->lpContext;
		pOnlineData->iOffset = nPos;
		pOnlineData->dwSharedMemorySize = sizeof(DC_MESSAGE) + sizeof(DC_ONLINEDATA) + (_MAX_PATH + 1) * 2;

		char username[64]="Unknown",groupname[64]="Unknown",action[20]="Unknown",lastaction[1024]="Unknown",ident[MAX_IDENT], pwd[_MAX_PWD + 1], ip[16];

		// Send Message
		SendMessage(hIoFTPD, WM_SHMEM, NULL, (LPARAM)hMemory);
		// Wait until processed (5 secs)
		if (WaitForSingleObject(hEvent, 5000) == WAIT_TIMEOUT) break;
		if (!lpMessage->dwReturn) {
			nPos = pOnlineData->iOffset;
			if (iPos>=nPos || nPos == 1024)
				break;

			int actionId = (int)pOnlineData->OnlineData.bTransferStatus;
			strcpy(lastaction,pOnlineData->OnlineData.szAction);
			int interval = pOnlineData->OnlineData.dwIntervalLength;
			DWORD bytesTransfered = pOnlineData->OnlineData.dwBytesTransfered;
			strcpy(ident,pOnlineData->OnlineData.szIdent);
			strcpy(pwd,pOnlineData->OnlineData.szVirtualPath);
			INT64 totalBytesTransfered = pOnlineData->OnlineData.i64TotalBytesTransfered;
			struct in_addr temp; temp.s_addr = pOnlineData->OnlineData.ulClientIp; strcpy(ip, inet_ntoa(temp));

			int UserId = pOnlineData->OnlineData.Uid;
			if (UserId==-1) continue; // -1 occurs when user is login			resolveUidToName(UserId,username);

			// Get groupid
			PUSERFILE pUserFile = (PUSERFILE)lpMessage->lpContext;
			lpMessage->dwIdentifier	= DC_USERFILE_OPEN;
			pUserFile->Uid = UserId;
			dwReturn = SendMessage(hIoFTPD, WM_SHMEM, NULL, (LPARAM)hMemory);
			if (!dwReturn) {
				// Wait until processed (5 secs)
				if (WaitForSingleObject(hEvent, 5000) == WAIT_TIMEOUT) break;

				resolveGidToName(pUserFile->Gid,groupname);
			}
			lpMessage->dwIdentifier	= DC_USERFILE_CLOSE;;
			dwReturn = SendMessage(hIoFTPD, WM_SHMEM, NULL, (LPARAM)hMemory);
			if (!dwReturn) {
				if (WaitForSingleObject(hEvent, 5000) == WAIT_TIMEOUT) break;
			}

			switch(actionId) {
				case 0: strcpy(action,"idle"); break;
				case 1: strcpy(action,"download"); break;
				case 2: strcpy(action,"upload"); break;
				case 3: strcpy(action,"list"); break;
			}
			if (stristr(lastaction,"PASS ")!=NULL)
				strcpy(lastaction,"PASS ******");
			int speed = 0;
			if (interval!=0)
				speed = bytesTransfered/interval;
			printf("CIDX;%i;%s;%s;%s;%s;%s;%s;%s;%i;%i\n",iPos,username,groupname,ident,ip,action,lastaction,pwd,speed,totalBytesTransfered);

			Users++;
			iPos = nPos;
		}
		if (lpMessage->dwReturn == (DWORD)-1)
			break;
		pOnlineData->iOffset++;
	}
	closeSharedMem();
}
Mouton is offline  
Closed Thread

Tags
bool, break;, int, return, winapi

Thread Tools
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
errors with SSL secure file transfers xmage General Discussion 6 02-18-2005 04:20 PM
Site to site question, wont connect Xbox4144 General Discussion 3 01-09-2005 10:38 AM
Complete List of .ini only settings Linkster Frequently Asked Questions (FAQ) 2 05-15-2003 06:52 AM
Pasv bug darkone Bug Reports 0 01-30-2003 02:16 PM


All times are GMT -5. The time now is 07:02 PM.

Parts of this site powered by vBulletin Mods & Addons from DragonByte Technologies Ltd. (Details)