I would like help in getting this to reboot a Win 2K system as well.

Thanks.

; Reboot WinXP
    .386
    .model  flat,stdcall
    option  casemap:none

    include \masm32\include\windows.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\advapi32.inc

    include \masm32\macros\macros.asm

    includelib  \masm32\lib\kernel32.lib
    includelib  \masm32\lib\user32.lib
    includelib  \masm32\lib\advapi32.lib

; Local Prototypes
;-------------------
    IsWinNT        PROTO
    ReqNTPrivilege  PROTO :DWORD

.const
;-------------------
    dwMaskNT        DWORD  2

.data
;-------------------
    msg_NotNT  BYTE    "This is NOT an NT system.",0
    msg_NotPL  BYTE    "Privilege requested NOT granted.",13,"Unable to reboot.",0
    AppName    BYTE    "ASM Win NT Shutdown",0

.code
;-------------------
start:
    invoke  IsWinNT
    ;----------------------------------------------------------------
    ; if is not an NT system we don't need other stuff and we can
    ; directly call ExitWindowsEx(), so this demo will exit.
    ;----------------------------------------------------------------
    .if eax == FALSE       
      invoke  MessageBox,NULL,addr msg_NotNT,addr AppName,MB_OK
      invoke  ExitProcess,NULL
    .endif
    ;----------------------------------------------------------------
    ; with ReqNTPrivilege call, we ask for the 'SeShutdownPrivilege'
    ; note string names of possible privilege are in windows.inc
    ;----------------------------------------------------------------
    invoke  ReqNTPrivilege, SADD("SeShutdownPrivilege")
    .if eax == FALSE
      invoke  MessageBox,NULL,addr msg_NotPL,addr AppName,MB_OK
      invoke  ExitProcess,NULL
    .endif
    invoke  ExitWindowsEx, EWX_REBOOT , 0 ; For Reboot, use EWX_REBOOT
    invoke  ExitProcess,NULL
;
;
IsWinNT proc
;------------------
; return TRUE (not zero) in eax if we are in win nt systems
;
    LOCAL osvi:OSVERSIONINFO
;
    mov    osvi.dwOSVersionInfoSize, sizeof osvi
    invoke  GetVersionEx, addr osvi
    .if eax == 0
      ret
    .endif
    mov    eax, osvi.dwPlatformId
    and    eax, dwMaskNT
    ret
;-------------------
IsWinNT endp
;
;
ReqNTPrivilege proc lpPrivilegeName:DWORD
;-------------------
; return TRUE (not zero) in eax if privilege is granted
; lpPrivilegeName parameter points to a string with request privilege name
;
    LOCAL  hProcess:DWORD
    LOCAL  hToken:DWORD
    LOCAL  phToken:DWORD
    LOCAL  RetLen:DWORD
    LOCAL  pRetLen:DWORD
    LOCAL  tkp:TOKEN_PRIVILEGES
    LOCAL  tkp_old:TOKEN_PRIVILEGES
;
    invoke  GetCurrentProcess
    mov    hProcess, eax
    lea    eax, hToken
    mov    phToken, eax
    invoke  OpenProcessToken, hProcess, \
            TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, \
            phToken 
    .if eax != FALSE
      lea    eax, tkp.Privileges[0].Luid
      invoke  LookupPrivilegeValue, NULL, \
              lpPrivilegeName, \
              eax
      lea    eax, RetLen
      mov    pRetLen, eax
      mov    tkp.PrivilegeCount, 1
      mov    tkp.Privileges[0].Attributes, SE_PRIVILEGE_ENABLED
      invoke  AdjustTokenPrivileges, hToken, \
              NULL, \
              addr tkp, \
              sizeof tkp_old, \
              addr tkp_old, \
              pRetLen
    .endif
    ret
;-------------------   
ReqNTPrivilege endp
;
;
            end    start

Posted on 2006-01-18 08:12:06 by skywalker
Same mistake you made last time.  :lol:

Regards,  P1  8)
Posted on 2006-01-18 12:45:46 by P1

Same mistake you made last time.  :lol:

Regards,  P1  8)


I didn't write this code, maybe I forgot what someone told me to do to fix it. It's been a while.

Does :lol: mean lots on the line. :-)



Posted on 2006-01-18 13:46:22 by skywalker
This should help you remember.
http://www.masmforum.com/simple/index.php?topic=3629.msg27183#msg27183

Regards,  P1  8)
Posted on 2006-01-19 12:58:00 by P1

This should help you remember.
http://www.masmforum.com/simple/index.php?topic=3629.msg27183#msg27183

Regards,  P1  8)


This is what I have so far. Got 2 compiler errors.

I need to define szShut.
Not sure how or where.

  .386
    .model  flat,stdcall
    option  casemap:none

;Here's mine.  You will need to add variables.

    include \masm32\include\windows.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\advapi32.inc

    include \masm32\macros\macros.asm

    includelib  \masm32\lib\kernel32.lib
    includelib  \masm32\lib\user32.lib
    includelib  \masm32\lib\advapi32.lib

; Local Prototypes
;-------------------
    IsWinNT        PROTO
    ReqNTPrivilege  PROTO :DWORD

.const
;-------------------
    dwMaskNT        DWORD  2

.data
;-------------------
    msg_NotNT  BYTE    "This is NOT an NT system.",0
    msg_NotPL  BYTE    "Privilege requested NOT granted.",13,"Unable to reboot.",0
    AppName    BYTE    "ASM Win NT Shutdown",0

.code
;-------------------
start:
    invoke  IsWinNT
    ;----------------------------------------------------------------
    ; If this isn't an NT system we don't need other stuff and we can
    ; directly call ExitWindowsEx(), so this demo will exit.
    ;----------------------------------------------------------------
    .if eax == FALSE       
      invoke  MessageBox,NULL,addr msg_NotNT,addr AppName,MB_OK
      invoke  ExitProcess,NULL
    .endif
    ;----------------------------------------------------------------
    ; with ReqNTPrivilege call, we ask for the 'SeShutdownPrivilege'
    ; note string names of possible privilege are in windows.inc
    ;----------------------------------------------------------------
    invoke  ReqNTPrivilege, SADD("SeShutdownPrivilege")
    .if eax == FALSE
      invoke  MessageBox,NULL,addr msg_NotPL,addr AppName,MB_OK
      invoke  ExitProcess,NULL
    .endif
    invoke  ExitWindowsEx, EWX_SHUTDOWN , 0 ; For Reboot, use EWX_REBOOT
    invoke  ExitProcess,NULL
;
;
IsWinNT proc
;------------------
; return TRUE (not zero) in eax if we are in win nt systems
;
    LOCAL osvi:OSVERSIONINFO
;
    mov    osvi.dwOSVersionInfoSize, sizeof osvi
    invoke  GetVersionEx, addr osvi
    .if eax == 0
      ret
    .endif
    mov    eax, osvi.dwPlatformId
    and    eax, dwMaskNT
    ret
;-------------------
IsWinNT endp
;
;
ReqNTPrivilege proc lpPrivilegeName:DWORD
;-------------------
; return TRUE (not zero) in eax if privilege is granted
; lpPrivilegeName parameter points to a string with request privilege name
;
    LOCAL  hProcess:DWORD
    LOCAL  hToken:DWORD
    LOCAL  phToken:DWORD
    LOCAL  RetLen:DWORD
    LOCAL  pRetLen:DWORD
    LOCAL  tkp:TOKEN_PRIVILEGES
    LOCAL  tkp_old:TOKEN_PRIVILEGES
;
    invoke  GetCurrentProcess
    mov    hProcess, eax
    lea    eax, hToken
    mov    phToken, eax
    invoke  OpenProcessToken, hProcess,TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY,phToken 

;BOOL LookupPrivilegeValue(
;
;    LPCTSTR lpSystemName, // address of string specifying the system
;    LPCTSTR lpName, // address of string specifying the privilege
;    PLUID lpLuid // address of locally unique identifier
;  );

    invoke LookupPrivilegeValue,NULL, addr szShut, addr tkp.Privileges[0].Luid
    mov    tkp.PrivilegeCount,1
    mov tkp.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED
    invoke AdjustTokenPrivileges,hToken,FALSE, ADDR tkp, 0, NULL, 0
    invoke ExitWindowsEx,EWX_REBOOT or EWX_FORCE,0


.if eax != FALSE
      lea    eax, tkp.Privileges[0].Luid
      invoke  LookupPrivilegeValue, NULL, \
              lpPrivilegeName, \
              eax
      lea    eax, RetLen
      mov    pRetLen, eax
      mov    tkp.PrivilegeCount, 1
      mov    tkp.Privileges[0].Attributes, SE_PRIVILEGE_ENABLED
      invoke  AdjustTokenPrivileges, hToken,NULL,addr tkp, sizeof tkp_old,addr tkp_old, \
              pRetLen
    .endif
    ret
 
ReqNTPrivilege endp
;
;
            end    start

Posted on 2006-01-19 15:05:46 by skywalker
szShut      db "SeShutdownPrivilege",0


Regards,  P1  8)
Posted on 2006-01-20 12:16:01 by P1