左键需要作为赋值的左操作数 - LOBYTE / HIBYTE

lvalue required as left operand of assignment - LOBYTE / HIBYTE

本文关键字:操作数 LOBYTE HIBYTE 赋值      更新时间:2023-10-16

我在下面的函数中收到关于 LOBYTE/HIBYTE/LODWORD 行lvalue required as left operand error

typedef DWORD _DWORD;
typedef BYTE _BYTE;
typedef WORD _WORD;
signed int __stdcall checkSerial(int serial, int serialLength)
{
  int v2; // ecx@1
  int v3; // ecx@3
  int v4; // ecx@5
  int v5; // ecx@7
  int v6; // dx@9
  signed int v7; // ecx@10
  char v8; // dl@11
  __int16 v9; // cx@13
  signed int result; // eax@21
  v2 = 0;
  do
  {
    *(_DWORD *)(v2 + serial) ^= 0x1234567u;
    *(_BYTE *)(v2 + serial) &= 0xEu;
    v2 += 4;
  }
  while ( v2 != 8 );
  v3 = 0;
  do
    *(_BYTE *)(serial + 8) += *(_BYTE *)(v3++ + serial);
  while ( v3 != serialLength );
  v4 = 0;
  do
  {
    *(_DWORD *)(v4 + serial) ^= 0x89ABCDEu;
    *(_BYTE *)(v4 + serial) &= 0xEu;
    v4 += 4;
  }
  while ( v4 != 8 );
  v5 = 0;
  do
    *(_BYTE *)(serial + 9) += *(_BYTE *)(v5++ + serial);
  while ( v5 != serialLength );
  LOBYTE(v6) = *(_BYTE *)(serial + 9);
  HIBYTE(v6) = *(_BYTE *)(serial + 8);
  if ( v6 != 0x42DE )
    goto LABEL_25;
  v7 = 9;
  do
  {
    v8 = *(_BYTE *)(v7 + serial) ^ *(_BYTE *)(v7 + serial);
    --v7;
  }
  while ( (_WORD)v7 );
  if ( (*(_WORD *)(serial + 8) ^ 0xEEEE) != 0x30AC )
    goto LABEL_25;
  LOBYTE(v9) = *(_BYTE *)serial;
  HIBYTE(v9) = *(_BYTE *)(serial + 1);
  if ( v9 != 0xB008u )
    goto LABEL_25;
  if ( *(_DWORD *)serial != 0x7A81B008 )
    goto LABEL_25;
  LOWORD(v7) = 0;
  do
  {
    v8 ^= 0xAu;
    v7 += 4;
  }
  while ( v7 <= 12 );
  if ( *(_DWORD *)(serial + 4) != 0x388DBF02
    || *(_BYTE *)(serial + 5) != 191
    || *(_BYTE *)(serial + 6) != 141
    || *(_BYTE *)(serial + 5) != 191 )
LABEL_25:
    result = 1;
  else
    result = 0;
  return result;
}

LOBYTE(v9) = *(_BYTE *)串行;HIBYTE(v9) = *(_BYTE *)(串行 + 1);

例如,这些行导致错误 - 但为什么?LOBYTE 被定义为 LOBYTE(x) ((BYTE)(x)),那么为什么我不能直接投射它呢?

修改值子集的方法是使用布尔运算符,例如:

v9 &= ~255; // mask off low byte (set to 0)
v9 |= *(_BYTE*)serial; // or in the new low byte value

但是,由于您要修改 16 位值的两个字节,最简单的方法是在一个操作中分配它:

v9 = (*(_BYTE*)(*serial + 1) << 8) | (*(_BYTE*)serial);