none
ERROR_MOD_NOT_FOUND...

    General discussion

  • Hi,

    Please, consider the following code:

    [DllImport("User32.dll",SetLastError=true)]
    static extern bool ExitWindowsEx(uint uFlags, long uReason);

    [DllImport("Kernel32.dll",SetLastError=true)]
    static extern IntPtr GetCurrentProcess();

    [DllImport("Advapi32.dll",SetLastError=true)]
    static unsafe extern bool OpenProcessToken(IntPtr ProcessHandle, uint DesiredAccess, IntPtr* TokenHandle);

    [DllImport("Advapi32.dll",SetLastError=true)]
    static unsafe extern bool LookupPrivilegeValue(string SystemName, string PrivilegeName, long* luid);

    [DllImport("Advapi32.dll",SetLastError=true)]
    static unsafe extern bool AdjustTokenPrivileges(IntPtr TokenHandle, bool DisableAllPrivileges,
    TOKEN_PRIVILEGES* NewState, 
    long BufferLength, TOKEN_PRIVILEGES* PreviousState, out IntPtr ReturnLength);

    [StructLayout(LayoutKind.Sequential)]
    public struct TOKEN_PRIVILEGES
    {
    public long PrivilegeCount;
    public LUID_AND_ATTRIBUTES Privileges;
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct LUID_AND_ATTRIBUTES 
    {
    public long Luid;
    public long Attributes;
    }
    .....................................................
    unsafe bool ShutDown()
    {
    IntPtr handle;
    long luid;
    IntPtr ReturnedLength;

    TOKEN_PRIVILEGES tkp = new TOKEN_PRIVILEGES();
    tkp.PrivilegeCount = 1;
    tkp.Privileges = new LUID_AND_ATTRIBUTES();

    Process ProcessHandle = Process.GetCurrentProcess();
    MessageBox.Show("Handle to process :" + ProcessHandle.Handle.ToString());

    OpenProcessToken(ProcessHandle.Handle,(0x0020)|(0x0008), &handle);
    MessageBox.Show("After OpenProcessToken :"+Marshal.GetLastWin32Error().ToString());

    LookupPrivilegeValue(null,"SeShutdownPrivilege", &luid);
    MessageBox.Show("After LookupPrivilegeValue :"+Marshal.GetLastWin32Error().ToString());
    MessageBox.Show("LIUD :" +luid.ToString());

    tkp.Privileges.Luid = luid;
    tkp.PrivilegeCount = 1;
    tkp.Privileges.Attributes = (0x00000002L);//SE_PRIVILEGE_ENABLED

    TOKEN_PRIVILEGES tkp1 = new TOKEN_PRIVILEGES();
    tkp1.Privileges = new LUID_AND_ATTRIBUTES();

    AdjustTokenPrivileges(handle, false, &tkp, 0, &tkp1 , out ReturnedLength);
    MessageBox.Show("After AdjustTokenPrivileges :"+Marshal.GetLastWin32Error().ToString());

    if(!ExitWindowsEx(0x00000001|0x00000004,0x00040000))
    {
    MessageBox.Show(Marshal.GetLastWin32Error().ToString());                
    return false;
    }
    return true;
    }

    First, if I call the win32 GetCurrentProcess I get invalid handle(-1)...Why is that?
    Then I am getting an error after calling OpenProcessToken:
    It is error 126 - ERROR_MOD_NOT_FOUND and it messes the whole further process...
    And after LookupPrivilegeValue I get:
    error 997 - ERROR_IO_PENDING.
    Also I have problems with TOKEN_PRIVILEGES structure - it has one field of 
    LUID_AND_PRIVILEGES array but if I set it as an array I get exception that says:
    Cannot Marshal Privileges as struct type...(or smth like that)

    Please, look at the code and tell me what am I doing wrong!
    By the way this example is token from the Platform SDK - "Shutting Down" and it works just fine when compiled in a MFC program - it shuts down the system!

    Thanks in advance!
    Gogou
    Sunday, April 20, 2003 6:11 PM

All replies

  • Greetings, I created a form and pasted in your code exactly as you have it here. I didn't have any problems with GetCurrentProcess and subsequent calls (although I admit I didn't run ExitWindowsEx (not on my own machine right now). 

    Have you continued to experience difficulties with this code? I would be interested to see the resolution.
    Monday, June 16, 2003 5:32 PM