windows c++ 解析 SHD 文件

#include <Windows.h>
#include <string>

using namespace std;

typedef struct
{
    LARGE_INTEGER offDevMode;
    unsigned long dwPageCount;
    LARGE_INTEGER offUserName;
    HANDLE hFile;
    wstring PrintTaskUserName;
}DataInfo_t;

static DataInfo_t s_DataInfo;
typedef struct _tagSYSTEMTIME {
    unsigned short wYear;
    unsigned short wMonth;
    unsigned short wDayOfWeek;
    unsigned short wDay;
    unsigned short wHour;
    unsigned short wMinute;
    unsigned short wSecond;
    unsigned short wMilliseconds;
} SystemTime;


typedef struct __SHADOW_FILE_HEADER_WIN2000 {
    unsigned long dwSignature;        //SHD_SIGNATURE_WIN2000
    unsigned long dwHeaderSize;
    unsigned short wStatus;
    unsigned short wUnknown1;
    unsigned long dwJobID;
    unsigned long dwPriority;
    unsigned long offUserName;        //Offset of WideChar+0
    unsigned long offNotifyName;      //Offset of WideChar+0
    unsigned long offDocumentName;    //Offset of WideChar+0
    unsigned long offPort;            //Offset of WideChar+0
    unsigned long offPrinterName;     //Offset of WideChar+0
    unsigned long offDriverName;      //Offset of WideChar+0
    unsigned long offDevMode;         //Offset of DEVMODE
    unsigned long offPrintProcessor;  //Offset of WideChar+0
    unsigned long offDataFormat;      //Offset of WideChar+0
    unsigned long dwUnknown2;
    SystemTime stSubmitTime;
    unsigned long dwStartTime;
    unsigned long dwUntilTime;
    unsigned long dwSizeSPL;          //Size of SPL File
    unsigned long dwPageCount;
    unsigned long dwSizeSecurityInfo; //Size of SecurityInfo
    unsigned long offSecurityInfo;    //Offset of SECURITY_DESCRIPTOR
    unsigned long dwUnknown3;
    unsigned long dwUnknown4;
    unsigned long dwUnknown5;
    unsigned long offComputername;    //Offset of WideChar+0
    unsigned long dwSPLSize2;
} SHADOW_FILE_HEADER_WIN2000, * PSHADOW_FILE_HEADER_WIN2000;

typedef struct __SHADOW_FILE_HEADER_WIN2000_64 {
    unsigned long dwSignature;        //SHD_SIGNATURE_WIN2000
    unsigned long dwHeaderSize;
    unsigned short wStatus;
    unsigned short wUnknown1;
    unsigned long dwJobID;

    ULONGLONG dwPriority;
    ULONGLONG offUserName;        //Offset of WideChar+0
    ULONGLONG offNotifyName;      //Offset of WideChar+0
    ULONGLONG offDocumentName;    //Offset of WideChar+0
    ULONGLONG offPort;            //Offset of WideChar+0
    ULONGLONG offPrinterName;     //Offset of WideChar+0
    ULONGLONG offDriverName;      //Offset of WideChar+0
    ULONGLONG offDevMode;         //Offset of DEVMODE
    ULONGLONG offPrintProcessor;  //Offset of WideChar+0
    ULONGLONG offDataFormat;      //Offset of WideChar+0
    ULONGLONG dwUnknown2;

    SystemTime stSubmitTime;
    unsigned long dwStartTime;
    unsigned long dwUntilTime;
    unsigned long dwSizeSPL;          //Size of SPL File
    unsigned long dwPageCount;
    unsigned long dwSizeSecurityInfo; //Size of SecurityInfo

    unsigned long offSecurityInfo;    //Offset of SECURITY_DESCRIPTOR
    unsigned long dwUnknown3;
    unsigned long dwUnknown4;
    unsigned long dwUnknown5;
    unsigned long offComputername;    //Offset of WideChar+0
    unsigned long dwSPLSize2;
} SHADOW_FILE_HEADER_WIN2000_64, * PSHADOW_FILE_HEADER_WIN2000_64;
BOOL IsWow64()
{
	SYSTEM_INFO SysInfo;
	GetNativeSystemInfo(&SysInfo);
	if (SysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||
		SysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
	{
		return TRUE;
	}
	return FALSE;
}
BOOL ParseShd_Head()
{
    BOOL bRet = IsWow64();
    DWORD nNumberOfBytesRead, nNumberOfBytesToRead;
    nNumberOfBytesToRead = bRet ? sizeof(SHADOW_FILE_HEADER_WIN2000_64) :
        sizeof(SHADOW_FILE_HEADER_WIN2000);
    if (bRet)
    {
        SHADOW_FILE_HEADER_WIN2000_64 Shadow;
        bRet = ReadFile(s_DataInfo.hFile, &Shadow, nNumberOfBytesToRead, &nNumberOfBytesRead, NULL);
        s_DataInfo.offDevMode.QuadPart = Shadow.offDevMode;
        s_DataInfo.dwPageCount = Shadow.dwPageCount;
        s_DataInfo.offUserName.QuadPart = Shadow.offUserName;
    }
    else
    {
        SHADOW_FILE_HEADER_WIN2000 Shadow;
        bRet = ReadFile(s_DataInfo.hFile, &Shadow, nNumberOfBytesToRead, &nNumberOfBytesRead, NULL);
        s_DataInfo.offDevMode.QuadPart = Shadow.offDevMode;
        s_DataInfo.dwPageCount = Shadow.dwPageCount;
        s_DataInfo.offUserName.QuadPart = Shadow.offUserName;
    }
    if (!bRet)
    {
        return FALSE;
    }
    
    return TRUE;
}
BOOL ParseShd_Data()
{
    if (!SetFilePointerEx(s_DataInfo.hFile, s_DataInfo.offDevMode, &s_DataInfo.offDevMode, FILE_BEGIN))
    {
        return FALSE;
    }
    DEVMODE Dev;
    DWORD nNumberOfBytesToRead,nUserNameLen;
    if (!ReadFile(s_DataInfo.hFile, &Dev, sizeof(Dev), &nNumberOfBytesToRead, NULL) || nNumberOfBytesToRead != sizeof(Dev))
    {
        return FALSE;
    }
    if (!SetFilePointerEx(s_DataInfo.hFile, s_DataInfo.offUserName, &s_DataInfo.offUserName, FILE_BEGIN))
    {
        return FALSE;
    }
    LARGE_INTEGER nFileSize = { 0 };
    GetFileSizeEx(s_DataInfo.hFile, &nFileSize);
    nUserNameLen = nFileSize.QuadPart - s_DataInfo.offUserName.QuadPart;
    s_DataInfo.PrintTaskUserName.resize(nUserNameLen, 0);
    if (!ReadFile(s_DataInfo.hFile, (wchar_t *)s_DataInfo.PrintTaskUserName.data(), nUserNameLen, &nNumberOfBytesToRead, NULL) || nNumberOfBytesToRead != nUserNameLen)
    {
        return FALSE;
    }
    return TRUE;
}
BOOL ParseShd(LPCTSTR lpFileName)
{
    s_DataInfo.hFile = CreateFile(lpFileName,
        GENERIC_READ,
        FILE_SHARE_READ,
        NULL,
        OPEN_EXISTING,
        0,
        NULL);
    if (!s_DataInfo.hFile || s_DataInfo.hFile == INVALID_HANDLE_VALUE)
    {
        return FALSE;
    }
    if (!ParseShd_Head())
    {
        return FALSE;
    }
    if (!ParseShd_Data())
    {
        return FALSE;
    }
    return TRUE;
}
int main(void)
{
	ParseShd(L"C:\\Windows\\System32\\spool\\PRINTERS\\00002.SHD");
	return 0;
}

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
shd文件是一种由苹果公司开发的文件格式,用于保存系统和应用程序的调试和性能信息。它通常用于调试崩溃问题和性能瓶颈,并对软件进行优化。 要解析shd文件,我们需要使用适当的工具和方法。以下是一般的解析过程: 1. 首先,我们需要一个可用的shd文件。这个文件通常是由应用程序或系统生成的,用于记录关于程序运行时的调试数据和性能信息。可以通过捕获程序的运行日志或使用特定的调试工具来获取shd文件。 2. 一旦我们获得了shd文件,我们可以使用相应的解析工具进行分析。苹果公司提供了一些用于解析shd文件的工具,如Xcode和Instruments。这些工具可以打开shd文件,并提供了一个界面,允许用户浏览和分析文件中的数据。 3. 在Xcode中,我们可以使用"Organizer"窗口中的"Devices"选项卡来查看和解析shd文件。选择正确的设备和应用程序,然后导航到"Logs"部分。在这里,我们可以找到相关的shd文件并打开它。Xcode将会解析文件并显示其内容,包括崩溃日志、调试信息和性能数据。 4. 在Instruments中,我们可以通过选择正确的设备和应用程序来打开shd文件。然后,我们可以选择适当的工具(如CPU Profiler、Memory Usage等),并使用其界面来查看和分析shd文件中的数据。Instruments还提供了不同的视图和图表,以帮助我们理解和解释数据。 总之,解析shd文件需要使用适当的工具,并且需要有相关的知识和经验。通过这些工具,我们可以深入了解软件的运行状况,并找到问题的根源。这将有助于改善软件的质量和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值