コード例 #1
0
ファイル: module.c プロジェクト: alu3177/-LDH-Pract4
/******************************************************************
 *		SymGetModuleInfo (DBGHELP.@)
 *
 */
BOOL  WINAPI SymGetModuleInfo(HANDLE hProcess, DWORD dwAddr,
                              PIMAGEHLP_MODULE ModuleInfo)
{
    IMAGEHLP_MODULE     mi;
    IMAGEHLP_MODULEW64  miw64;

    if (sizeof(mi) < ModuleInfo->SizeOfStruct) FIXME("Wrong size\n");

    miw64.SizeOfStruct = sizeof(miw64);
    if (!SymGetModuleInfoW64(hProcess, dwAddr, &miw64)) return FALSE;

    mi.SizeOfStruct  = miw64.SizeOfStruct;
    mi.BaseOfImage   = miw64.BaseOfImage;
    mi.ImageSize     = miw64.ImageSize;
    mi.TimeDateStamp = miw64.TimeDateStamp;
    mi.CheckSum      = miw64.CheckSum;
    mi.NumSyms       = miw64.NumSyms;
    mi.SymType       = miw64.SymType;
    WideCharToMultiByte(CP_ACP, 0, miw64.ModuleName, -1,
                        mi.ModuleName, sizeof(mi.ModuleName), NULL, NULL);
    WideCharToMultiByte(CP_ACP, 0, miw64.ImageName, -1,
                        mi.ImageName, sizeof(mi.ImageName), NULL, NULL);
    WideCharToMultiByte(CP_ACP, 0, miw64.LoadedImageName, -1,
                        mi.LoadedImageName, sizeof(mi.LoadedImageName), NULL, NULL);

    memcpy(ModuleInfo, &mi, ModuleInfo->SizeOfStruct);

    return TRUE;
}
コード例 #2
0
ファイル: module.c プロジェクト: alu3177/-LDH-Pract4
/******************************************************************
 *		SymGetModuleInfoW (DBGHELP.@)
 *
 */
BOOL  WINAPI SymGetModuleInfoW(HANDLE hProcess, DWORD dwAddr,
                               PIMAGEHLP_MODULEW ModuleInfo)
{
    IMAGEHLP_MODULEW64  miw64;
    IMAGEHLP_MODULEW    miw;

    if (sizeof(miw) < ModuleInfo->SizeOfStruct) FIXME("Wrong size\n");

    miw64.SizeOfStruct = sizeof(miw64);
    if (!SymGetModuleInfoW64(hProcess, dwAddr, &miw64)) return FALSE;

    miw.SizeOfStruct  = miw64.SizeOfStruct;
    miw.BaseOfImage   = miw64.BaseOfImage;
    miw.ImageSize     = miw64.ImageSize;
    miw.TimeDateStamp = miw64.TimeDateStamp;
    miw.CheckSum      = miw64.CheckSum;
    miw.NumSyms       = miw64.NumSyms;
    miw.SymType       = miw64.SymType;
    strcpyW(miw.ModuleName, miw64.ModuleName);
    strcpyW(miw.ImageName, miw64.ImageName);
    strcpyW(miw.LoadedImageName, miw64.LoadedImageName);
    memcpy(ModuleInfo, &miw, ModuleInfo->SizeOfStruct);

    return TRUE;
}
コード例 #3
0
BOOL dbg_load_module(HANDLE hProc, HANDLE hFile, const WCHAR* name, DWORD_PTR base, DWORD size)
{
    BOOL ret = SymLoadModuleExW(hProc, NULL, name, NULL, base, size, NULL, 0);
    if (ret)
    {
        IMAGEHLP_MODULEW64      ihm;
        ihm.SizeOfStruct = sizeof(ihm);
        if (SymGetModuleInfoW64(hProc, base, &ihm) && (ihm.PdbUnmatched || ihm.DbgUnmatched))
            dbg_printf("Loaded unmatched debug information for %s\n", wine_dbgstr_w(name));
    }
    return ret;
}
コード例 #4
0
const Symbol * const SymEngine::GetSymbol(DWORD64 dwAddress)
{
	if (dwAddress == 0)
		return nullptr;

	Symbol& symbol = cache[dwAddress];

	if (symbol.address != 0)
		return &symbol;

	if (!isInitialized)
		return nullptr;

	symbol.address = dwAddress;

	// Module Name
	IMAGEHLP_MODULEW64 moduleInfo;
	memset(&moduleInfo, 0, sizeof(IMAGEHLP_MODULEW64));
	moduleInfo.SizeOfStruct = sizeof(moduleInfo);
	if (SymGetModuleInfoW64(hProcess, dwAddress, &moduleInfo))
	{
		symbol.module = moduleInfo.ImageName;
	}


	// FileName and Line
	IMAGEHLP_LINEW64 lineInfo;
	memset(&lineInfo, 0, sizeof(IMAGEHLP_LINEW64));
	lineInfo.SizeOfStruct = sizeof(lineInfo);
	DWORD dwDisp;
	if (SymGetLineFromAddrW64(hProcess, dwAddress, &dwDisp, &lineInfo))
	{
		symbol.file = lineInfo.FileName;
		symbol.line = lineInfo.LineNumber;
	}

	const size_t length = (sizeof(SYMBOL_INFOW) + MAX_SYM_NAME*sizeof(WCHAR) + sizeof(ULONG64) - 1) / sizeof(ULONG64) + 1;

	// Function Name
	ULONG64 buffer[length];
	PSYMBOL_INFOW dbgSymbol = (PSYMBOL_INFOW)buffer;
	memset(dbgSymbol, 0, sizeof(buffer));
	dbgSymbol->SizeOfStruct = sizeof(SYMBOL_INFOW);
	dbgSymbol->MaxNameLen = MAX_SYM_NAME;
	if (SymFromAddrW(hProcess, dwAddress, &symbol.offset, dbgSymbol))
	{
		symbol.function.resize(dbgSymbol->NameLen);
		memcpy(&symbol.function[0], &dbgSymbol->Name[0], sizeof(WCHAR) * dbgSymbol->NameLen);
	}

	return &symbol;
}
コード例 #5
0
ファイル: module.c プロジェクト: alu3177/-LDH-Pract4
/******************************************************************
 *		SymGetModuleInfo64 (DBGHELP.@)
 *
 */
BOOL  WINAPI SymGetModuleInfo64(HANDLE hProcess, DWORD64 dwAddr,
                                PIMAGEHLP_MODULE64 ModuleInfo)
{
    IMAGEHLP_MODULE64   mi64;
    IMAGEHLP_MODULEW64  miw64;

    if (sizeof(mi64) < ModuleInfo->SizeOfStruct)
    {
        SetLastError(ERROR_MOD_NOT_FOUND); /* NOTE: native returns this error */
        WARN("Wrong size %u\n", ModuleInfo->SizeOfStruct);
        return FALSE;
    }

    miw64.SizeOfStruct = sizeof(miw64);
    if (!SymGetModuleInfoW64(hProcess, dwAddr, &miw64)) return FALSE;

    mi64.SizeOfStruct  = miw64.SizeOfStruct;
    mi64.BaseOfImage   = miw64.BaseOfImage;
    mi64.ImageSize     = miw64.ImageSize;
    mi64.TimeDateStamp = miw64.TimeDateStamp;
    mi64.CheckSum      = miw64.CheckSum;
    mi64.NumSyms       = miw64.NumSyms;
    mi64.SymType       = miw64.SymType;
    WideCharToMultiByte(CP_ACP, 0, miw64.ModuleName, -1,
                        mi64.ModuleName, sizeof(mi64.ModuleName), NULL, NULL);
    WideCharToMultiByte(CP_ACP, 0, miw64.ImageName, -1,
                        mi64.ImageName, sizeof(mi64.ImageName), NULL, NULL);
    WideCharToMultiByte(CP_ACP, 0, miw64.LoadedImageName, -1,
                        mi64.LoadedImageName, sizeof(mi64.LoadedImageName), NULL, NULL);
    WideCharToMultiByte(CP_ACP, 0, miw64.LoadedPdbName, -1,
                        mi64.LoadedPdbName, sizeof(mi64.LoadedPdbName), NULL, NULL);

    mi64.CVSig         = miw64.CVSig;
    WideCharToMultiByte(CP_ACP, 0, miw64.CVData, -1,
                        mi64.CVData, sizeof(mi64.CVData), NULL, NULL);
    mi64.PdbSig        = miw64.PdbSig;
    mi64.PdbSig70      = miw64.PdbSig70;
    mi64.PdbAge        = miw64.PdbAge;
    mi64.PdbUnmatched  = miw64.PdbUnmatched;
    mi64.DbgUnmatched  = miw64.DbgUnmatched;
    mi64.LineNumbers   = miw64.LineNumbers;
    mi64.GlobalSymbols = miw64.GlobalSymbols;
    mi64.TypeInfo      = miw64.TypeInfo;
    mi64.SourceIndexed = miw64.SourceIndexed;
    mi64.Publics       = miw64.Publics;

    memcpy(ModuleInfo, &mi64, ModuleInfo->SizeOfStruct);

    return TRUE;
}
コード例 #6
0
ファイル: winTrace.cpp プロジェクト: shell800/winTrace
void InsertInfo(DWORD dwExceptionAddr,DWORD dwThreadID,PTCHAR tcTemp)
{
	if(dwLastOffset != dwExceptionAddr)
	{
		dwLastOffset = dwExceptionAddr;

		IMAGEHLP_MODULEW64 imgMod = {0};
		imgMod.SizeOfStruct = sizeof(imgMod);
		SymGetModuleInfoW64(piProcInfo.hProcess,dwLastOffset,&imgMod);

		DWORD dwBytesWritten;
		if(bDisableNTDLLLogging)
		{
			if(wcsstr(imgMod.ModuleName,L"ntdll") == NULL)
			{
				memset(pSymbol,0,sizeof(SYMBOL_INFO) + MAX_SYM_NAME);
				pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
				pSymbol->MaxNameLen = MAX_SYM_NAME;
				SymFromAddr(piProcInfo.hProcess,dwLastOffset,NULL,pSymbol);

				if(!(bCutDownLog && strstr(szTempSym,pSymbol->Name) != NULL))
				{
					memcpy(szTempSym,pSymbol->Name,strlen(pSymbol->Name));
					swprintf_s(tcTemp,255,L"%08d\t%08X\t%08X\t%s.%S\r\n",dwStepCount,dwThreadID,dwLastOffset,imgMod.ModuleName,pSymbol->Name);
					WriteFile(hLogFile,tcTemp,wcslen(tcTemp) * sizeof(TCHAR),&dwBytesWritten,NULL);
				}
			}
		}
		else
		{
			ZeroMemory(pSymbol,sizeof(SYMBOL_INFO) + MAX_SYM_NAME);
			pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
			pSymbol->MaxNameLen = MAX_SYM_NAME;
			SymFromAddr(piProcInfo.hProcess,dwLastOffset,NULL,pSymbol);

			if(!(bCutDownLog && strstr(szTempSym,pSymbol->Name) != NULL))
			{
				memcpy(szTempSym,pSymbol->Name,strlen(pSymbol->Name));
				swprintf_s(tcTemp,255,L"%08d\t%08X\t%08X\t%s.%S\r\n",dwStepCount,dwThreadID,dwLastOffset,imgMod.ModuleName,pSymbol->Name);
				WriteFile(hLogFile,tcTemp,wcslen(tcTemp) *  sizeof(TCHAR),&dwBytesWritten,NULL);
			}
		}
	}
	dwStepCount++;
}
コード例 #7
0
int32 FWindowsPlatformStackWalk::GetProcessModuleSignatures(FStackWalkModuleInfo *ModuleSignatures, const int32 ModuleSignaturesSize)
{
	FPlatformStackWalk::InitStackWalking();

	HANDLE		ProcessHandle = GetCurrentProcess(); 

	// Enumerate process modules.
	HMODULE* ModuleHandlePointer = GetProcessModules(ProcessHandle);
	if (!ModuleHandlePointer)
	{
		return 0;
	}

	// Find out how many modules we need to load modules for.
	IMAGEHLP_MODULEW64 Img = {0};
	Img.SizeOfStruct = sizeof(Img);

	int32 SignatureIndex = 0;

	// Load the modules.
	for( int32 ModuleIndex = 0; ModuleHandlePointer[ModuleIndex] && SignatureIndex < ModuleSignaturesSize; ModuleIndex++ )
	{
		MODULEINFO ModuleInfo = {0};
#if WINVER > 0x502
		WCHAR ModuleName[MAX_PATH] = {0};
		WCHAR ImageName[MAX_PATH] = {0};
#else
		ANSICHAR ModuleName[MAX_PATH] = { 0 };
		ANSICHAR ImageName[MAX_PATH] = { 0 };
#endif
#if PLATFORM_64BITS
		static_assert(sizeof( MODULEINFO ) == 24, "Broken alignment for 64bit Windows include.");
#else
		static_assert(sizeof( MODULEINFO ) == 12, "Broken alignment for 32bit Windows include.");
#endif
		FGetModuleInformation( ProcessHandle, ModuleHandlePointer[ModuleIndex], &ModuleInfo, sizeof( ModuleInfo ) );
		FGetModuleFileNameEx( ProcessHandle, ModuleHandlePointer[ModuleIndex], ImageName, MAX_PATH );
		FGetModuleBaseName( ProcessHandle, ModuleHandlePointer[ModuleIndex], ModuleName, MAX_PATH );

		// Load module.
		if(SymGetModuleInfoW64(ProcessHandle, (DWORD64)ModuleInfo.lpBaseOfDll, &Img))
		{
			FStackWalkModuleInfo Info = {0};
			Info.BaseOfImage = Img.BaseOfImage;
			FCString::Strcpy(Info.ImageName, Img.ImageName);
			Info.ImageSize = Img.ImageSize;
			FCString::Strcpy(Info.LoadedImageName, Img.LoadedImageName);
			FCString::Strcpy(Info.ModuleName, Img.ModuleName);
			Info.PdbAge = Img.PdbAge;
			Info.PdbSig = Img.PdbSig;
			FMemory::Memcpy(&Info.PdbSig70, &Img.PdbSig70, sizeof(GUID));
			Info.TimeDateStamp = Img.TimeDateStamp;

			ModuleSignatures[SignatureIndex] = Info;
			++SignatureIndex;
		}
	}

	// Free the module handle pointer allocated in case the static array was insufficient.
	FMemory::Free(ModuleHandlePointer);

	return SignatureIndex;
}
コード例 #8
0
void qtDLGCallstack::ShowCallStack()
{
	clsDebugger *pDebugger = qtDLGNanomite::GetInstance()->coreDebugger;
	
	HANDLE	hProc = pDebugger->GetCurrentProcessHandle(),
			hThread = OpenThread(THREAD_GETSET_CONTEXT,false,pDebugger->GetCurrentTID());
	PSYMBOL_INFOW pSymbol = (PSYMBOL_INFOW)malloc(sizeof(SYMBOL_INFOW) + MAX_PATH * 2);
	DWORD dwMaschineMode = NULL;
	LPVOID pContext;
	STACKFRAME64 stackFr = {0};
	stackFr.AddrPC.Mode = AddrModeFlat;
	stackFr.AddrFrame.Mode = AddrModeFlat;
	stackFr.AddrStack.Mode = AddrModeFlat;

	QString sFuncName,
		sFuncMod,
		sReturnToFunc,
		sReturnToMod;
	quint64 dwStackAddr,
		dwReturnTo,
		dwEIP,
		dwDisplacement;
	IMAGEHLP_LINEW64 imgSource = {0};
	IMAGEHLP_MODULEW64 imgMod = {0};

#ifdef _AMD64_
	BOOL bIsWOW64 = false;

	if(clsAPIImport::pIsWow64Process)
		clsAPIImport::pIsWow64Process(hProc,&bIsWOW64);

	if(bIsWOW64)
	{
		dwMaschineMode = IMAGE_FILE_MACHINE_I386;
		WOW64_CONTEXT cTT = pDebugger->wowProcessContext;
		pContext = &cTT;

		stackFr.AddrPC.Offset = cTT.Eip;
		stackFr.AddrFrame.Offset = cTT.Ebp;
		stackFr.AddrStack.Offset = cTT.Esp;	
	}
	else
	{
		dwMaschineMode = IMAGE_FILE_MACHINE_AMD64;
		CONTEXT cTT = pDebugger->ProcessContext;
		pContext = &cTT;

		stackFr.AddrPC.Offset = cTT.Rip;
		stackFr.AddrFrame.Offset = cTT.Rbp;
		stackFr.AddrStack.Offset = cTT.Rsp;	
	}
#else
	dwMaschineMode = IMAGE_FILE_MACHINE_I386;
	CONTEXT cTT = pDebugger->ProcessContext;
	pContext = &cTT;

	stackFr.AddrPC.Offset = cTT.Eip;
	stackFr.AddrFrame.Offset = cTT.Ebp;
	stackFr.AddrStack.Offset = cTT.Esp;	

#endif

	tblCallstack->setRowCount(0);

	do
	{
		if(!StackWalk64(dwMaschineMode,hProc,hThread,&stackFr,pContext,NULL,SymFunctionTableAccess64,SymGetModuleBase64,0))        
			break;

		memset(&imgSource,0,sizeof(IMAGEHLP_LINEW64));
		imgSource.SizeOfStruct = sizeof(IMAGEHLP_LINEW64);

		dwStackAddr = stackFr.AddrStack.Offset;
		dwEIP = stackFr.AddrPC.Offset;
		dwReturnTo = stackFr.AddrReturn.Offset;


		memset(&imgMod,0,sizeof(IMAGEHLP_MODULEW64));
		imgMod.SizeOfStruct = sizeof(IMAGEHLP_MODULEW64);
		memset(pSymbol,0,sizeof(SYMBOL_INFOW) + MAX_PATH * 2);
		pSymbol->SizeOfStruct = sizeof(SYMBOL_INFOW);
		pSymbol->MaxNameLen = MAX_PATH;

		SymGetModuleInfoW64(hProc,dwEIP,&imgMod);
		SymFromAddrW(hProc,dwEIP,&dwDisplacement,pSymbol);
		sFuncName = QString::fromWCharArray(pSymbol->Name);
		sFuncMod = QString::fromWCharArray(imgMod.ModuleName);


		memset(&imgMod,0,sizeof(IMAGEHLP_MODULEW64));
		imgMod.SizeOfStruct = sizeof(IMAGEHLP_MODULEW64);
		memset(pSymbol,0,sizeof(SYMBOL_INFOW) + MAX_PATH * 2);
		pSymbol->SizeOfStruct = sizeof(SYMBOL_INFOW);
		pSymbol->MaxNameLen = MAX_PATH;

		SymGetModuleInfoW64(hProc,dwReturnTo,&imgMod);
		SymFromAddrW(hProc,dwReturnTo,&dwDisplacement,pSymbol);
		sReturnToMod = QString::fromWCharArray(imgMod.ModuleName);
		sReturnToFunc = QString::fromWCharArray(pSymbol->Name);

		if(SymGetLineFromAddrW64(hProc,dwEIP,(PDWORD)&dwDisplacement,&imgSource))
		{
			OnCallStack(dwStackAddr,
				dwReturnTo,sReturnToFunc,sReturnToMod,
				dwEIP,sFuncName,sFuncMod,
				QString::fromWCharArray(imgSource.FileName),imgSource.LineNumber);
		}
		else
		{
			OnCallStack(dwStackAddr,
				dwReturnTo,sReturnToFunc,sReturnToMod,
				dwEIP,sFuncName,sFuncMod,
				QString(""),0);
		}

	}while(stackFr.AddrReturn.Offset != 0);

	free(pSymbol);
	CloseHandle(hThread);
}
コード例 #9
0
ファイル: clsCallstackWorker.cpp プロジェクト: jskew/Nanomite
void clsCallstackWorker::run()
{
    HANDLE hThread = OpenThread(THREAD_GETSET_CONTEXT, false, m_processingData.threadID);
    PSYMBOL_INFOW pSymbol = (PSYMBOL_INFOW)malloc(sizeof(SYMBOL_INFOW) + MAX_PATH * 2);
    DWORD dwMaschineMode = NULL;
    quint64 dwDisplacement = NULL;
    LPVOID pContext;
    QList<callstackDisplay> callstackDisplayData;
    callstackDisplay newDisplayData = { 0 };
    STACKFRAME64 stackFr = { 0 };
    IMAGEHLP_LINEW64 imgSource = { 0 };
    IMAGEHLP_MODULEW64 imgMod = { 0 };

    stackFr.AddrPC.Mode = AddrModeFlat;
    stackFr.AddrFrame.Mode = AddrModeFlat;
    stackFr.AddrStack.Mode = AddrModeFlat;

#ifdef _AMD64_
    if(m_processingData.isWOW64)
    {
        dwMaschineMode = IMAGE_FILE_MACHINE_I386;
        WOW64_CONTEXT cTT = m_processingData.wowProcessContext;
        pContext = &cTT;

        stackFr.AddrPC.Offset = cTT.Eip;
        stackFr.AddrFrame.Offset = cTT.Ebp;
        stackFr.AddrStack.Offset = cTT.Esp;
    }
    else
    {
        dwMaschineMode = IMAGE_FILE_MACHINE_AMD64;
        CONTEXT cTT = m_processingData.processContext;
        pContext = &cTT;

        stackFr.AddrPC.Offset = cTT.Rip;
        stackFr.AddrFrame.Offset = cTT.Rbp;
        stackFr.AddrStack.Offset = cTT.Rsp;
    }
#else
    dwMaschineMode = IMAGE_FILE_MACHINE_I386;
    CONTEXT cTT = m_processingData.processContext;
    pContext = &cTT;

    stackFr.AddrPC.Offset = cTT.Eip;
    stackFr.AddrFrame.Offset = cTT.Ebp;
    stackFr.AddrStack.Offset = cTT.Esp;

#endif

    do
    {
        if(!StackWalk64(dwMaschineMode, m_processingData.processHandle, hThread, &stackFr, pContext, NULL, SymFunctionTableAccess64, SymGetModuleBase64, 0))
            break;

        memset(&imgSource, 0, sizeof(IMAGEHLP_LINEW64));
        imgSource.SizeOfStruct = sizeof(IMAGEHLP_LINEW64);

        newDisplayData.stackAddress		= stackFr.AddrStack.Offset;
        newDisplayData.currentOffset	= stackFr.AddrPC.Offset;
        newDisplayData.returnOffset		= stackFr.AddrReturn.Offset;


        memset(&imgMod, 0, sizeof(IMAGEHLP_MODULEW64));
        imgMod.SizeOfStruct = sizeof(IMAGEHLP_MODULEW64);
        memset(pSymbol, 0, sizeof(SYMBOL_INFOW) + MAX_PATH * 2);
        pSymbol->SizeOfStruct = sizeof(SYMBOL_INFOW);
        pSymbol->MaxNameLen = MAX_PATH;

        SymGetModuleInfoW64(m_processingData.processHandle, newDisplayData.currentOffset, &imgMod);
        SymFromAddrW(m_processingData.processHandle, newDisplayData.currentOffset, &dwDisplacement, pSymbol);
        newDisplayData.currentFunctionName = QString::fromWCharArray(pSymbol->Name);
        newDisplayData.currentModuleName = QString::fromWCharArray(imgMod.ModuleName);


        memset(&imgMod, 0, sizeof(IMAGEHLP_MODULEW64));
        imgMod.SizeOfStruct = sizeof(IMAGEHLP_MODULEW64);
        memset(pSymbol, 0, sizeof(SYMBOL_INFOW) + MAX_PATH * 2);
        pSymbol->SizeOfStruct = sizeof(SYMBOL_INFOW);
        pSymbol->MaxNameLen = MAX_PATH;

        SymGetModuleInfoW64(m_processingData.processHandle, newDisplayData.returnOffset, &imgMod);
        SymFromAddrW(m_processingData.processHandle, newDisplayData.returnOffset , &dwDisplacement, pSymbol);
        newDisplayData.returnModuleName = QString::fromWCharArray(imgMod.ModuleName);
        newDisplayData.returnFunctionName = QString::fromWCharArray(pSymbol->Name);

        if(SymGetLineFromAddrW64(m_processingData.processHandle, newDisplayData.currentOffset, (PDWORD)&dwDisplacement, &imgSource))
        {

            newDisplayData.sourceFilePath		= QString::fromWCharArray(imgSource.FileName);
            newDisplayData.sourceLineNumber		= imgSource.LineNumber;
        }
        else
        {
            newDisplayData.sourceFilePath		= "";
            newDisplayData.sourceLineNumber		= 0;
        }

        callstackDisplayData.append(newDisplayData);

    } while(stackFr.AddrReturn.Offset != 0);

    free(pSymbol);
    CloseHandle(hThread);

    emit OnCallstackFinished(callstackDisplayData);
}