.386 ; minimum processor needed for 32 bit .model flat, stdcall ; FLAT memory model & STDCALL calling option casemap :none ; set code to case sensitive include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\masm32.inc include \masm32\include\shlwapi.inc include \masm32\include\user32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\masm32.lib includelib \masm32\lib\shlwapi.lib includelib \masm32\lib\user32.lib Main proto .const szDateFormat db "yyyy-MM-dd",0 qwOneDay dq 864000000000 szNewLine db 13,10,0 szProgramName db "mkdatadir: ",0 szFatal db "fatal: ",0 szErrorCmdLine db "invalid command line arg",0 ;szErrorUnderflow db "arg must be positive",0 szErrorBigArg db "command line arg too large",0 dwMaxOffset dd 1000000 .code start: call Main Main proc local stNow :SYSTEMTIME local ftNow :FILETIME local ftOffset :FILETIME local dtBuf[64] :BYTE local bReturn :BYTE local szDestination[MAX_PATH] :BYTE local szOffset[128] :BYTE ; GetCL uses a 128-byte buffer local dwOffset :DWORD invoke GetLocalTime, ADDR stNow mov bReturn, 100 ; ; Return values in eax ; ; 1 = successful operation ; 2 = no argument exists at specified arg number ; 3 = non matching quotation marks ; 4 = empty quotation marks ; 5 = buffer too small invoke GetCL, 1, ADDR szOffset invoke lstrlen, ADDR szOffset mov dwOffset, eax cmp dwOffset, 1 jl endloop parsecmdline: ; lea esi, szOffset mov eax, 0 myloop: lodsb cmp al, '0' jl nan cmp al, '9' jg nan dec dwOffset jnz myloop jmp endloop nan: invoke StdOut, ADDR szProgramName invoke StdOut, ADDR szFatal invoke StdOut, ADDR szErrorCmdLine mov bReturn, 102 jmp endprogram endloop: invoke atol, ADDR szOffset mov dwOffset, eax cmp eax, dwMaxOffset jle input_good invoke StdOut, ADDR szProgramName invoke StdOut, ADDR szFatal invoke StdOut, ADDR szErrorBigArg mov bReturn, 103 jmp endprogram input_good: invoke SystemTimeToFileTime, ADDR stNow, ADDR ftNow finit fild qwOneDay ; load source fild dwOffset fmul ; multiply source by multiplier fild ftNow fadd fistp ftNow ; store result in variable invoke FileTimeToSystemTime, ADDR ftNow, ADDR stNow invoke GetDateFormat, LOCALE_USER_DEFAULT, NULL, ADDR stNow, ADDR szDateFormat, ADDR dtBuf, SIZEOF dtBuf invoke GetCurrentDirectory, SIZEOF szDestination, ADDR szDestination invoke PathCombine, ADDR szDestination, ADDR szDestination, ADDR dtBuf invoke StdOut, ADDR szDestination invoke StdOut, ADDR szNewLine invoke CreateDirectory, ADDR szDestination, NULL mov bReturn, 0 endprogram: invoke ExitProcess, bReturn ret Main endp end start