Andrew Pastushenko пишет:
Посылаю код для определения системных ресурсов (как в "Индикаторе ресурсов"). Использовалась статья "Calling 16-bit code from 32-bit in Windows 95".
{ GetFeeSystemResources routine for 32-bit Delphi.
Works only under Windows 9x }
unit SysRes32;
interface
const
//Constants whitch specifies the type of resource to be checked
GFSR_SYSTEMRESOURCES = $0000;
GFSR_GDIRESOURCES = $0001;
GFSR_USERRESOURCES = $0002;
// 32-bit function exported from this unit
function GetFeeSystemResources(SysResource: Word): Word;
implementation
uses SysUtils, Windows;
type
//Procedural variable for testing for a nil
TGetFSR = function(ResType: Word): Word; stdcall;
//Declare our class exeptions
EThunkError = class(Exception);
EFOpenError = class(Exception);
var
User16Handle : THandle = 0;
GetFSR : TGetFSR = nil;
//Prototypes for some undocumented API
function LoadLibrary16(LibFileName: PAnsiChar): THandle; stdcall; external kernel32 index 35;
function FreeLibrary16(LibModule: THandle): THandle; stdcall; external kernel32 index 36;
function GetProcAddress16(Module: THandle; ProcName: LPCSTR): TFarProc;stdcall; external kernel32 index 37;
procedure QT_Thunk; cdecl; external 'kernel32.dll' name 'QT_Thunk';
{$StackFrames On}
function GetFeeSystemResources(SysResource: Word): Word;
var EatStackSpace: String[$3C];
begin
// Ensure buffer isn't optimised away
EatStackSpace := '';
@GetFSR:=GetProcAddress16(User16Handle, 'GETFREESYSTEMRESOURCES');
if Assigned(GetFSR) then //Test result for nil
asm
//Manually push onto the stack type of resource to be checked first
push SysResource
//Load routine address into EDX
mov edx, [GetFSR]
//Call routine
call QT_Thunk
//Assign result to the function
mov @Result, ax
end
else raise EFOpenError.Create('GetProcAddress16 failed!');
end;
initialization
//Check Platform for Windows 9x
if Win32Platform <> VER_PLATFORM_WIN32_WINDOWS then raise EThunkError.Create('Flat thunks only supported under Windows 9x');
//Load 16-bit DLL (USER.EXE)
User16Handle:= LoadLibrary16(PChar('User.exe'));
if User16Handle < 32 then raise EFOpenError.Create('LoadLibrary16 failed!');
finalization
//Release 16-bit DLL when done
if User16Handle <> 0 then FreeLibrary16(User16Handle);
end.
Как проверить, имеем ли мы административные привилегии в системе?
Nomadic пишет:
// Routine: check if the user has administrator provileges
// Was converted from C source by Akzhan Abdulin. Not properly tested.
type PTOKEN_GROUPS = TOKEN_GROUPS^;
function RunningAsAdministrator: Boolean;
var
SystemSidAuthority: SID_IDENTIFIER_AUTHORITY = SECURITY_NT_AUTHORITY;
psidAdmin: PSID;
ptg: PTOKEN_GROUPS = nil;
htkThread: Integer; { HANDLE }
cbTokenGroups: Longint; { DWORD }