0

我正在使用 C++ 制作简单的 dll 数据包嗅探器,它将连接到应用程序,并将接收到的数据包写入 INI 文件。不幸的是,在 20-30 分钟后,它使主要应用程序崩溃了。

当收到数据包时,receivedPacket()将被调用。20 多分钟后,WriteCount值约为 150,000-200,000.. 并开始出现 C++ 运行时错误/崩溃,GetLastError()我得到的代码是 0x8,即ERROR_NOT_ENOUGH_MEMORYWritePrivateProfileStringA()返回0

void writeToINI(LPCSTR iSec,LPCSTR iKey,int iVal){
    sprintf(inival, _T("%d"), iVal);
    WritePrivateProfileStringA(iSec,iKey,inival,iniloc);

//sprintf(strc, _T("%d \n"), WriteCount);
//WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), strc, strlen(strc), 0, 0);

    WriteCount++;

}

void receivedPacket(char *packet,WORD size){
    switch ( packet[2] )
    {
    case 0x30:
        // Size : 0x5F
        ID = *(signed char*)&packet[0x10];
        X = *(signed short*)&packet[0x20];
        Y = *(signed short*)&packet[0x22];
        Z = *(signed short*)&packet[0x24];

        sprintf(inisec, _T("PACKET_%d"), (ID+1));

        writeToINI(inisec,"id",ID);
        writeToINI(inisec,"x",X);
        writeToINI(inisec,"y",Y);
        writeToINI(inisec,"z",Z);
     }

     [.....OTHER CASES.....]

}

谢谢 :)

4

2 回答 2

2

WritePrivateProfileString()并且GetPrivateProfileString()非常慢(由于每次调用都解析 INI 文件),您可以:

  • 使用现有的解析之一,但我不确定内存效率也不支持顺序写入。
  • 编写您自己的顺序 INI 编写器:
    1. 读取文件(或仅部分,部分,如果它太大)
    2. 查找部分和键(如果未找到,则在文件末尾创建新部分,或查找插入位置,如果要排序部分),保存键和下一个键的文件位置
    3. 改变价值
    4. 保存(原始文件的开头到键的位置+实际更改的键+原始文件中下一个键的位置到文件的末尾)(如果在末尾创建了新部分,您可以简单地将新部分附加到原始文件)(如果数据包重写经常使用相同的 ID,您可以在每个键后添加填充空格,大以保存所需类型的任何值(例如:更改X=1---\nX=100-\n(更改-为空格),因此您的键大小恒定,您只能更新文件的一部分))
  • 数据库,例如MySQL
  • 编写二进制文件(最快的解决方案)并使程序读取值或转换为文本

小记:我用GetPrivateProfileString()几年前读取设置文件(大小约1KB),读取形式HDD:50ms,从U盘读取:1000ms!,更改后(1.读取文件到内存2.运行我自己的解析器)它在 HDD 和 USB 上都在 1ms 内运行。

于 2012-08-19T08:08:59.730 回答
0

谢谢大家的回复,但看起来问题不是来自WritePrivateProfileStringA()

我只需要malloc()为 Hook 添加额外的尺寸。

:)

于 2012-08-19T11:34:22.343 回答