Delphi 获取系统版本{2K~10}

Function RtlGetVersion(Var lpOsInfo :TOSVersionInfoExW):DWORD; Stdcall; External 'ntdll.dll';
//GetVersionEx 在Win8以后的的版本会以兼容模式来获取结果导致获取到的NT内核版本都是6.2所以这里用RtlGetVersion
Function GetOs():Byte;
  Const
    SM_SERVERR2 = 89;
Var
  OSINFO: TOSVersionInfoExW;
begin
  Result := 255;
  OSINFO.dwOSVersionInfoSize := SizeOf(TOSVersionInfoExW);
  if RtlGetVersion(OSINFO) = 0 then
  begin
    if (OSINFO.dwMajorVersion = 5) and (OSINFO.dwMinorVersion = 0) then
      Result := 1//'Windows 2000'
    else if (OSINFO.dwMajorVersion = 5) and (OSINFO.dwMinorVersion = 1) then
      Result := 2//'Windows XP'
    else if (OSINFO.dwMajorVersion = 5) and (OSINFO.dwMinorVersion = 2) and (GetSystemMetrics(SM_SERVERR2) = 0) then
      Result := 3//'Windows Server 2003'
    else if (OSINFO.dwMajorVersion = 5) and (OSINFO.dwMinorVersion = 2) and (GetSystemMetrics(SM_SERVERR2) <> 0) then
      Result := 4//'Windows Server 2003 R2'
    else if (OSINFO.dwMajorVersion = 6) and (OSINFO.dwMinorVersion = 0) and (OSINFO.wProductType = VER_NT_WORKSTATION) then
      Result := 5//'Windows Vista'
    else if (OSINFO.dwMajorVersion = 6) and (OSINFO.dwMinorVersion = 0) and (OSINFO.wProductType <> VER_NT_WORKSTATION) then
      Result := 6//'Windows Server 2008'
    else if (OSINFO.dwMajorVersion = 6) and (OSINFO.dwMinorVersion = 1) and (OSINFO.wProductType <> VER_NT_WORKSTATION) then
      Result := 7//'Windows Server 2008 R2'
    else if (OSINFO.dwMajorVersion = 6) and (OSINFO.dwMinorVersion = 1) and (OSINFO.wProductType = VER_NT_WORKSTATION) then
      Result := 8//'Windows 7'
    else if (OSINFO.dwMajorVersion = 6) and (OSINFO.dwMinorVersion = 2) and (OSINFO.wProductType = VER_NT_WORKSTATION) then
      Result := 9//'Windows 8'
    else if (OSINFO.dwMajorVersion = 6) and (OSINFO.dwMinorVersion = 2) and (OSINFO.wProductType <> VER_NT_WORKSTATION) then
      Result := 10//'Windows Server 2012'
    else if (OSINFO.dwMajorVersion = 6) and (OSINFO.dwMinorVersion = 3) and (OSINFO.wProductType = VER_NT_WORKSTATION) then
      Result := 11//'Windows 8.1'
    else if (OSINFO.dwMajorVersion = 6) and (OSINFO.dwMinorVersion = 3) and (OSINFO.wProductType <> VER_NT_WORKSTATION) then
      Result := 12//'Windows Server 2012 R2'
    else if (OSINFO.dwMajorVersion = 10) and (OSINFO.dwMinorVersion = 0) and (OSINFO.wProductType = VER_NT_WORKSTATION) then
      Result := 13//'Windows 10'
    else if (OSINFO.dwMajorVersion = 10) and (OSINFO.dwMinorVersion = 0) and (OSINFO.wProductType <> VER_NT_WORKSTATION) then
      Result := 14//'Windows Server 2016 Technical Preview'
    else
      Result := 255;
  end;
end;


战略make Hook LsaApLogonUserEx2时X86/X64需要注意的地方

Type
{$IFDEF WIN64}
  xDWORD = DWORD64;
{$ELSE}
  xDWORD = DWORD;
{$ENDIF}

PMSV1_0_INTERACTIVE_LOGON= ^MSV1_0_INTERACTIVE_LOGON;
MSV1_0_INTERACTIVE_LOGON = Record
  MessageType     :MSV1_0_LOGON_SUBMIT_TYPE;
  LogonDomainName :UNICODE_STRING;
  UserName        :UNICODE_STRING;
  Password        :UNICODE_STRING;
End;
  
 
// 计算的时候需要考虑X86/X64的区别{内存地址长度的问题}
Function AdjustPointer(Buffer, Base:Pointer):xDWORD;
begin 
  if (xDWORD(Buffer) < xDWORD(Base)) then
  begin
    Result := xDWORD(Buffer);
  end else
  begin
    Result := (xDWORD(Buffer) - xDWORD(Base));
  end;
end;

// 计算字符串的偏移地址
ProtocolSubmitBuffer^.LogonDomainName.Buffer := PWideChar(xDWORD(ProtocolSubmitBuffer) + AdjustPointer(ProtocolSubmitBuffer^.LogonDomainName.Buffer, ClientBufferBase));

Windows Vista/7/8/8.1/2012下文件夹安全选项标签{用户权限标签} 失踪的处理

以下内容复制保存为 .reg 注册表文件后 双击导入即可


Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shellex\PropertySheetHandlers\{1f2e5c40-9550-11ce-99d2-00aa006e086c}]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer]
"NoSecurityTab"=-

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer]
"NoSecurityTab"=-