MASM – error A2042: statement too complex

在定义比较长的数据的时候会因为数据超过行限制而出现statement too complex或者line to long的错误提示,可以使用下面的代码:

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    include \masm32\include\masm32rt.inc
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    .data
      kostka1 real4 -1.0,-1.0, 1.0, 1.0,-1.0, 1.0, 1.0, 1.0, 1.0
              real4 -1.0, 1.0, 1.0,-1.0,-1.0,-1.0,-1.0, 1.0,-1.0
              real4  1.0, 1.0,-1.0, 1.0,-1.0,-1.0,-1.0, 1.0,-1.0
              real4 -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,-1.0
              real4 -1.0,-1.0,-1.0, 1.0,-1.0,-1.0, 1.0,-1.0, 1.0
              real4 -1.0,-1.0, 1.0, 1.0,-1.0,-1.0, 1.0, 1.0,-1.0
              real4  1.0, 1.0, 1.0, 1.0,-1.0, 1.0,-1.0,-1.0,-1.0
              real4 -1.0,-1.0, 1.0,-1.0, 1.0, 1.0,-1.0, 1.0,-1.0

      _SIZEOF_kostka1 = ($ - kostka1)
      dd_SIZEOF_kostka1 dd ($ - kostka1)

      tmp TEXTEQU %_SIZEOF_kostka1
      % echo _SIZEOF_kostka1 = tmp

    .code
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
start:
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    print ustr$(dd_SIZEOF_kostka1),13,10
    mov   eax, input(13,10,"Press enter to exit...")
    exit
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
end start
Continue Reading

Delphi Get HDD Serial Number


program keygenme;

uses
Windows,Messages,CommCtrl;

{$R software.RES}
var WinClass: TWndClassA;
Inst: HINST;
hWindow: HWND;
TheMessage: TMsg;

hDrive:HWND;
hID:HWND;
hf:THandle;

htitle:HWND;

cmbChange: HWND;
cmbAbout: HWND;
cmbExit: HWND;

PaintStruct: TPaintStruct;
PaintDC: HDC;
hFont1: HFONT;
isNT:Boolean;

function StrToInt(const S: string):Integer;
var
E: Integer;
begin
Val(S, Result, E);
end;

Continue Reading

从RegQueryValueExA到ZwQueryValueKey

对于注册表的REG_MULTI_SZ类型的数据个人感觉一直比较蛋疼,一个是因为在Delphi下竟然没有相关的函数,第二个是因为对于这类型的数据在使用ssdt hook修改数据的时候出现了很多问题。

为了明白到底是怎么处理的,于是就把相关的调用流程跟踪了一遍。至于是什么程序调用的这里就不提了,直接贴代码吧。

103B29D8    8B4C24 18       mov ecx,dword ptr ss:[esp+0x18]
103B29DC    8B3D 34F0EE10   mov edi,dword ptr ds:[<&ADVAPI32.RegQuer>; ADVAPI32.RegQueryValueExA
103B29E2    894424 14       mov dword ptr ss:[esp+0x14],eax
103B29E6    8D4424 14       lea eax,dword ptr ss:[esp+0x14]
103B29EA    50              push eax
103B29EB    6A 00           push 0x0
103B29ED    6A 00           push 0x0
103B29EF    6A 00           push 0x0
103B29F1    68 088FFD10     push iTunes_1.10FD8F08                   ; ASCII "SystemBiosVersion"
103B29F6    51              push ecx
103B29F7    FFD7            call edi
103B29F9    85C0            test eax,eax
103B29FB    75 48           jnz XiTunes_1.103B2A45
103B29FD    8B5424 14       mov edx,dword ptr ss:[esp+0x14]
103B2A01    52              push edx
103B2A02    50              push eax
103B2A03    E8 7820CDFF     call iTunes_1.10084A80
103B2A08    50              push eax
103B2A09    FF15 84FEEE10   call dword ptr ds:[<&KERNEL32.HeapAlloc>>; ntdll.RtlAllocateHeap
103B2A0F    8B4C24 18       mov ecx,dword ptr ss:[esp+0x18]
103B2A13    8BF0            mov esi,eax
103B2A15    8D4424 14       lea eax,dword ptr ss:[esp+0x14]
103B2A19    50              push eax
103B2A1A    56              push esi
103B2A1B    6A 00           push 0x0
103B2A1D    6A 00           push 0x0
103B2A1F    68 088FFD10     push iTunes_1.10FD8F08                   ; ASCII "SystemBiosVersion"
103B2A24    51              push ecx
103B2A25    FFD7            call edi

这里是应用层的第一次调用,在调用的时候第一次并没有分配相应的缓冲区来存放数据。这次调用的根本目的是为了获取注册表中对应的数据的大小。

Continue Reading

笔记本War3全屏设置工具

用笔记本玩过War3的都知道笔记本下War3可能无法全屏显示,周末的时候我就遇到了这个问题。于是自己写了一个小工具来测试了一下,效果还是可以了。

smile 猛击此处下载程序!

文件校验信息:

文件名: F:\Delphi Project\War III FullScreen\War3 Screen.exe
文件大小: 723087 字节 (706.14 KB)
修改日期: 2011-07-04 11:09
版本: 1.0.0.0
MD5: bcd29e08c9b034edb789f2d662a4f409
SHA1: e49d6b02b1c7f2cd86565832e7ea00f2f7d43326
SHA256: 5e156bcfa8716b38cc4d6ad6cc7a2becbfe90bf3516468dd9de36357811d4400
CRC32: 69ea5d87

 

 

蛋疼的 REG_MULTI_SZ

话说这个东西是够蛋疼的,当时在发《Delphi Read/Write REG_MULTI_SZ》一篇的时候就注意到读到的信息虽然是正确的,但是在写入的时候却发生了错误。如果再读的话那就更不对了。 从网上查了一下那个蛋疼的REG_MULTI_SZ到底是个什么东西,但是大部分人的结论就是这么一句:

REG_MULTI_SZ    一个以空字符结束的字符串数组,被两个null字符结束。

看了半天也没发现到底信息后面写的是什么东西,看来是我太笨了! sad 今天又遇到这个问题索性把注册表中的一个REG_MULTI_SZ   键值倒了出来,原来竟然是这么一串东东:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System]
"Component Information"=hex:00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
"Identifier"="AT/AT COMPATIBLE"
"Configuration Data"=hex(9):ff,ff,ff,ff,ff,ff,ff,ff,00,00,00,00,02,00,00,00,05,\
00,00,00,0c,00,00,00,00,00,00,00,00,00,00,00,80,00,ff,03,00,00,3f,00,fe,00,\
01,00,05,00,00,00,18,00,00,00,00,00,00,00,00,00,00,00,00,00,0c,00,00,de,00,\
00,00,00,0e,00,00,00,01,00,00,00,0f,00,00,00,01,00
"SystemBiosDate"="12/17/10"
"SystemBiosVersion"=hex(7):31,00,32,00,31,00,37,00,31,00,30,00,20,00,2d,00,20,\
00,32,00,30,00,31,00,30,00,31,00,32,00,31,00,37,00,00,00,00,00

结束的地方是00,00,00,00,00~ laugh ,知道了是怎么结束的也就知道该怎么写回去了。擦,太蛋疼了~