在下面的截获函数中,我有buff
作为指向缓冲区的指针,如何在不创建新的自己的缓冲区的情况下更改数据?
int WINAPI OwnRecv(SOCKET s, char FAR *buff, int len, int flags)
{
if(s == ServerSocket)
{
int received = pTrampolineRecv(s, buff, len, flags);
if(received <= 0)
{
return received;
}
unsigned char ReceiveBuffer[1024]; // how can i avoid creatin this by changing buff directly?
do_decrypt((const unsigned char *) buff, ReceiveBuffer, received, KeyTest, NULL);
buff = (char *) ReceiveBuffer;
return received;
}
return pTrampolineRecv(s, buff, len, flags);
}
UPD
我添加了do_decrypt
功能
bool do_decrypt(const unsigned char *in, unsigned char *out, int inlen)
{
int buflen, tmplen;
if(!EVP_DecryptUpdate(&Decrypt_ctx, out, &buflen, in, inlen))
{
return false;
}
if(!EVP_DecryptFinal_ex(&Decrypt_ctx, out + buflen, &tmplen))
{
return false;
}
return true;
}
答案 0 :(得分:1)
如果do_decrypt
不排除它,只需传入buff
作为调用的第二个参数,并进行适当的转换以使其“工作”(编译)。
do_decrypt((const unsigned char *) buff, buff, received, KeyTest, NULL);
这意味着您的输入和输出缓冲区是相同的,这在被调用函数中可能会有问题。
在这种情况下(并且在任何情况下)您还需要确保输出缓冲区中有足够的空间来容纳解密数据,否则将发生缓冲区溢出并且您将遇到大麻烦。例如 - 在你的代码中,假设有2048个字节而不是1024个。看起来你应该(假设解密不会改变数据长度)允许在`ReceiveBuffer中使用received
个字符。
您对ReceiveBuffer
到buff
的分配只有本地范围:来电者不会看到此更改。在任何情况下,这都会使得使用该函数非常混乱,因为它可能会也可能不会改变输入值。
答案 1 :(得分:0)
在直接使用WinAPI代码之前,你一定要看看有关指针的C ++教程。
此外,不推荐使用FAR关键字。
最简单的想法是
do_decrypt ((const unsigned char*) buff, (unsigned char *) buff, received, KeyTest, NULL);
基本上 - 将buff
作为输入和输出变量。
但是我不推荐使用它,因为我不知道do_decrypt
函数是如何工作的 - 你可能会在解密时弄乱你自己的数据。如果do_decrypt使用某种(可能更小的)内部缓冲区,则仅使用上面的内容。
也许尝试更多地澄清这个问题,因为现在我无法就此问题给你更多的建议。
编辑:所以,感谢其他答案,您可以在以下时间使用上述解决方案:
do_decrypt
功能允许原位操作 - 因此,正在读取正在读取的数据。答案 2 :(得分:0)
如果Bartek的答案不起作用 - 即,如果do_decrypt
不支持对输入和输出使用相同的缓冲区 - 那么您需要从ReceiveBuffer
复制数据进入buff
,可能使用strcpy
(如果它是空终止的)或memcpy
(如果没有)。