/* Copyright (c) 2010 Daniel Doubrovkine, All Rights Reserved * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package com.sun.jna.platform.win32; import java.util.Date; import com.sun.jna.Platform; import com.sun.jna.Pointer; import com.sun.jna.Structure; import com.sun.jna.Union; import com.sun.jna.platform.win32.BaseTSD.DWORD_PTR; import com.sun.jna.platform.win32.BaseTSD.ULONG_PTR; import com.sun.jna.platform.win32.WinDef.DWORD; import com.sun.jna.platform.win32.WinDef.DWORDLONG; import com.sun.jna.platform.win32.WinDef.WORD; import com.sun.jna.platform.win32.WinNT.HANDLE; /** * Ported from Winbase.h. * Microsoft Windows SDK 6.0A. * @author dblock[at]dblock.org */ public abstract class WinBase { /** Constant value representing an invalid HANDLE. */ public static HANDLE INVALID_HANDLE_VALUE = new HANDLE(Pointer.createConstant( Pointer.SIZE == 8 ? -1 : 0xFFFFFFFFL)); public static final int WAIT_FAILED = 0xFFFFFFFF; public static final int WAIT_OBJECT_0 = ((NTStatus.STATUS_WAIT_0 ) + 0 ); public static final int WAIT_ABANDONED = ((NTStatus.STATUS_ABANDONED_WAIT_0 ) + 0 ); public static final int WAIT_ABANDONED_0 = ((NTStatus.STATUS_ABANDONED_WAIT_0 ) + 0 ); /** * Maximum computer name length. * @return 15 on MAC, 31 on everything else. */ public static int MAX_COMPUTERNAME_LENGTH() { if (Platform.isMac()) { return 15; } else { return 31; } } /** * This logon type is intended for users who will be interactively using the computer, such * as a user being logged on by a terminal server, remote shell, or similar process. This * logon type has the additional expense of caching logon information for disconnected operations; * therefore, it is inappropriate for some client/server applications, such as a mail server. */ public static final int LOGON32_LOGON_INTERACTIVE = 2; /** * This logon type is intended for high performance servers to authenticate plaintext passwords. * The LogonUser function does not cache credentials for this logon type. */ public static final int LOGON32_LOGON_NETWORK = 3; /** * This logon type is intended for batch servers, where processes may be executing on behalf * of a user without their direct intervention. This type is also for higher performance servers * that process many plaintext authentication attempts at a time, such as mail or Web servers. * The LogonUser function does not cache credentials for this logon type. */ public static final int LOGON32_LOGON_BATCH = 4; /** * Indicates a service-type logon. The account provided must have the service privilege enabled. */ public static final int LOGON32_LOGON_SERVICE = 5; /** * This logon type is for GINA DLLs that log on users who will be interactively using the computer. * This logon type can generate a unique audit record that shows when the workstation was unlocked. */ public static final int LOGON32_LOGON_UNLOCK = 7; /** * This logon type preserves the name and password in the authentication package, which allows the * server to make connections to other network servers while impersonating the client. A server can * accept plaintext credentials from a client, call LogonUser, verify that the user can access the * system across the network, and still communicate with other servers. */ public static final int LOGON32_LOGON_NETWORK_CLEARTEXT = 8; /** * This logon type allows the caller to clone its current token and specify new credentials for * outbound connections. The new logon session has the same local identifier but uses different * credentials for other network connections. This logon type is supported only by the * LOGON32_PROVIDER_WINNT50 logon provider. */ public static final int LOGON32_LOGON_NEW_CREDENTIALS = 9; /** * Use the standard logon provider for the system. The default security provider is negotiate, * unless you pass NULL for the domain name and the user name is not in UPN format. In this case, * the default provider is NTLM. */ public static final int LOGON32_PROVIDER_DEFAULT = 0; /** * Use the Windows NT 3.5 logon provider. */ public static final int LOGON32_PROVIDER_WINNT35 = 1; /** * Use the NTLM logon provider. */ public static final int LOGON32_PROVIDER_WINNT40 = 2; /** * Use the negotiate logon provider. */ public static final int LOGON32_PROVIDER_WINNT50 = 3; /** * The FILETIME structure is a 64-bit value representing the number of * 100-nanosecond intervals since January 1, 1601 (UTC). * Conversion code in this class Copyright 2002-2004 Apache Software Foundation. * @author Rainer Klute (klute@rainer-klute.de) for the Apache Software Foundation (org.apache.poi.hpsf) */ public static class FILETIME extends Structure { public int dwLowDateTime; public int dwHighDateTime; /** * <p>The difference between the Windows epoch (1601-01-01 * 00:00:00) and the Unix epoch (1970-01-01 00:00:00) in * milliseconds: 11644473600000L. (Use your favorite spreadsheet * program to verify the correctness of this value. By the way, * did you notice that you can tell from the epochs which * operating system is the modern one? :-))</p> */ private static final long EPOCH_DIFF = 11644473600000L; /** * <p>Converts a Windows FILETIME into a {@link Date}. The Windows * FILETIME structure holds a date and time associated with a * file. The structure identifies a 64-bit integer specifying the * number of 100-nanosecond intervals which have passed since * January 1, 1601. This 64-bit value is split into the two double * words stored in the structure.</p> * * @param high The higher double word of the FILETIME structure. * @param low The lower double word of the FILETIME structure. * @return The Windows FILETIME as a {@link Date}. */ public static Date filetimeToDate(final int high, final int low) { final long filetime = (long) high << 32 | low & 0xffffffffL; final long ms_since_16010101 = filetime / (1000 * 10); final long ms_since_19700101 = ms_since_16010101 - EPOCH_DIFF; return new Date(ms_since_19700101); } /** * <p>Converts a {@link Date} into a filetime.</p> * * @param date The date to be converted * @return The filetime * * @see #filetimeToDate */ public static long dateToFileTime(final Date date) { final long ms_since_19700101 = date.getTime(); final long ms_since_16010101 = ms_since_19700101 + EPOCH_DIFF; return ms_since_16010101 * 1000 * 10; } public Date toDate() { return filetimeToDate(dwHighDateTime, dwLowDateTime); } public long toLong() { return toDate().getTime(); } public String toString() { return super.toString() + ": " + toDate().toString(); //$NON-NLS-1$ } } /* Local Memory Flags */ public static final int LMEM_FIXED = 0x0000; public static final int LMEM_MOVEABLE = 0x0002; public static final int LMEM_NOCOMPACT = 0x0010; public static final int LMEM_NODISCARD = 0x0020; public static final int LMEM_ZEROINIT = 0x0040; public static final int LMEM_MODIFY = 0x0080; public static final int LMEM_DISCARDABLE = 0x0F00; public static final int LMEM_VALID_FLAGS = 0x0F72; public static final int LMEM_INVALID_HANDLE = 0x8000; public static final int LHND = (LMEM_MOVEABLE | LMEM_ZEROINIT); public static final int LPTR = (LMEM_FIXED | LMEM_ZEROINIT); /* Flags returned by LocalFlags (in addition to LMEM_DISCARDABLE) */ public static final int LMEM_DISCARDED = 0x4000; public static final int LMEM_LOCKCOUNT = 0x00FF; /** * Specifies a date and time, using individual members for the month, * day, year, weekday, hour, minute, second, and millisecond. The time * is either in coordinated universal time (UTC) or local time, depending * on the function that is being called. * http://msdn.microsoft.com/en-us/library/ms724950(VS.85).aspx */ public static class SYSTEMTIME extends Structure { // The year. The valid values for this member are 1601 through 30827. public short wYear; // The month. The valid values for this member are 1 through 12. public short wMonth; // The day of the week. The valid values for this member are 0 through 6. public short wDayOfWeek; // The day of the month. The valid values for this member are 1 through 31. public short wDay; // The hour. The valid values for this member are 0 through 23. public short wHour; // The minute. The valid values for this member are 0 through 59. public short wMinute; // The second. The valid values for this member are 0 through 59. public short wSecond; // The millisecond. The valid values for this member are 0 through 999. public short wMilliseconds; } /** * The lpBuffer parameter is a pointer to a PVOID pointer, and that the nSize * parameter specifies the minimum number of TCHARs to allocate for an output * message buffer. The function allocates a buffer large enough to hold the * formatted message, and places a pointer to the allocated buffer at the address * specified by lpBuffer. The caller should use the LocalFree function to free * the buffer when it is no longer needed. */ public static final int FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100; /** * Insert sequences in the message definition are to be ignored and passed through * to the output buffer unchanged. This flag is useful for fetching a message for * later formatting. If this flag is set, the Arguments parameter is ignored. */ public static final int FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200; /** * The lpSource parameter is a pointer to a null-terminated message definition. * The message definition may contain insert sequences, just as the message text * in a message table resource may. Cannot be used with FORMAT_MESSAGE_FROM_HMODULE * or FORMAT_MESSAGE_FROM_SYSTEM. */ public static final int FORMAT_MESSAGE_FROM_STRING = 0x00000400; /** * The lpSource parameter is a module handle containing the message-table * resource(s) to search. If this lpSource handle is NULL, the current process's * application image file will be searched. Cannot be used with * FORMAT_MESSAGE_FROM_STRING. */ public static final int FORMAT_MESSAGE_FROM_HMODULE = 0x00000800; /** * The function should search the system message-table resource(s) for the * requested message. If this flag is specified with FORMAT_MESSAGE_FROM_HMODULE, * the function searches the system message table if the message is not found in * the module specified by lpSource. Cannot be used with FORMAT_MESSAGE_FROM_STRING. * If this flag is specified, an application can pass the result of the * GetLastError function to retrieve the message text for a system-defined error. */ public static final int FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000; /** * The Arguments parameter is not a va_list structure, but is a pointer to an array * of values that represent the arguments. This flag cannot be used with 64-bit * argument values. If you are using 64-bit values, you must use the va_list * structure. */ public static final int FORMAT_MESSAGE_ARGUMENT_ARRAY = 0x00002000; /** * The drive type cannot be determined. */ public static final int DRIVE_UNKNOWN = 0; /** * The root path is invalid, for example, no volume is mounted at the path. */ public static final int DRIVE_NO_ROOT_DIR = 1; /** * The drive is a type that has removable media, for example, a floppy drive * or removable hard disk. */ public static final int DRIVE_REMOVABLE = 2; /** * The drive is a type that cannot be removed, for example, a fixed hard drive. */ public static final int DRIVE_FIXED = 3; /** * The drive is a remote (network) drive. */ public static final int DRIVE_REMOTE = 4; /** * The drive is a CD-ROM drive. */ public static final int DRIVE_CDROM = 5; /** * The drive is a RAM disk. */ public static final int DRIVE_RAMDISK = 6; /** * The OVERLAPPED structure contains information used in * asynchronous (or overlapped) input and output (I/O). */ public static class OVERLAPPED extends Structure { public ULONG_PTR Internal; public ULONG_PTR InternalHigh; public int Offset; public int OffsetHigh; public HANDLE hEvent; } public static final int INFINITE = 0xFFFFFFFF; /** * Contains information about the current computer system. This includes the architecture and * type of the processor, the number of processors in the system, the page size, and other such * information. */ public static class SYSTEM_INFO extends Structure { public static class PI extends Structure { public static class ByReference extends PI implements Structure.ByReference { } /** * System's processor architecture. * This value can be one of the following values: * * PROCESSOR_ARCHITECTURE_UNKNOWN * PROCESSOR_ARCHITECTURE_INTEL * PROCESSOR_ARCHITECTURE_IA64 * PROCESSOR_ARCHITECTURE_AMD64 */ public WORD wProcessorArchitecture; /** * Reserved for future use. */ public WORD wReserved; } public static class UNION extends Union { public static class ByReference extends UNION implements Structure.ByReference { } /** * An obsolete member that is retained for compatibility with Windows NT 3.5 and earlier. * New applications should use the wProcessorArchitecture branch of the union. * Windows Me/98/95: The system always sets this member to zero, the value defined * for PROCESSOR_ARCHITECTURE_INTEL. */ public DWORD dwOemID; /** * Processor architecture. */ public PI.ByReference pi; } /** * Processor architecture. */ public UNION.ByReference processorArchitecture; /** * Page size and the granularity of page protection and commitment. */ public DWORD dwPageSize; /** * Pointer to the lowest memory address accessible to applications and dynamic-link libraries (DLLs). */ public Pointer lpMinimumApplicationAddress; /** * Pointer to the highest memory address accessible to applications and DLLs. */ public Pointer lpMaximumApplicationAddress; /** * Mask representing the set of processors configured into the system. Bit 0 is processor 0; bit 31 is processor 31. */ public DWORD_PTR dwActiveProcessorMask; /** * Number of processors in the system. */ public DWORD dwNumberOfProcessors; /** * An obsolete member that is retained for compatibility with Windows NT 3.5 and Windows Me/98/95. * Use the wProcessorArchitecture, wProcessorLevel, and wProcessorRevision members to determine * the type of processor. * PROCESSOR_INTEL_386 * PROCESSOR_INTEL_486 * PROCESSOR_INTEL_PENTIUM */ public DWORD dwProcessorType; /** * Granularity for the starting address at which virtual memory can be allocated. */ public DWORD dwAllocationGranularity; /** * System's architecture-dependent processor level. It should be used only for display purposes. * To determine the feature set of a processor, use the IsProcessorFeaturePresent function. * If wProcessorArchitecture is PROCESSOR_ARCHITECTURE_INTEL, wProcessorLevel is defined by the CPU vendor. * If wProcessorArchitecture is PROCESSOR_ARCHITECTURE_IA64, wProcessorLevel is set to 1. */ public WORD wProcessorLevel; /** * Architecture-dependent processor revision. */ public WORD wProcessorRevision; } /** * Contains information about the current state of both physical and virtual memory, including * extended memory. The GlobalMemoryStatusEx function stores information in this structure. */ public static class MEMORYSTATUSEX extends Structure { /** * The size of the structure, in bytes. */ public DWORD dwLength; /** * A number between 0 and 100 that specifies the approximate percentage of physical memory * that is in use (0 indicates no memory use and 100 indicates full memory use). */ public DWORD dwMemoryLoad; /** * The amount of actual physical memory, in bytes. */ public DWORDLONG ullTotalPhys; /** * The amount of physical memory currently available, in bytes. This is the amount of physical * memory that can be immediately reused without having to write its contents to disk first. * It is the sum of the size of the standby, free, and zero lists. */ public DWORDLONG ullAvailPhys; /** * The current committed memory limit for the system or the current process, whichever is smaller, in bytes. */ public DWORDLONG ullTotalPageFile; /** * The maximum amount of memory the current process can commit, in bytes. This value is equal to or smaller * than the system-wide available commit value. */ public DWORDLONG ullAvailPageFile; /** * The size of the user-mode portion of the virtual address space of the calling process, in bytes. */ public DWORDLONG ullTotalVirtual; /** * The amount of unreserved and uncommitted memory currently in the user-mode portion of the * virtual address space of the calling process, in bytes. */ public DWORDLONG ullAvailVirtual; /** * Reserved. This value is always 0. */ public DWORDLONG ullAvailExtendedVirtual; public MEMORYSTATUSEX() { dwLength = new DWORD(size()); } }; }