请大家谈谈对WinShell制作的看法 (100分)

  • 主题发起人 主题发起人 cornermoss
  • 开始时间 开始时间
C

cornermoss

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在正在做的项目里要有WinShell,就是系统启动时自动运行,并且获得系统的控制权。
对于自启动的问题,我现在是在RunOnce里运行,完毕再在Run里运行,并且FormShow时读
INI里的一个Boolean标志判断,如果是在Run里运行则Close并且写注册表到RunOnce,否则
写到Run(在CloseQuery里每次将标志改变)。现在这样可以防止自启动时Alt+Del+Ctrl结束
程序,但是很麻烦。不知道各位有没有更好更安全的办法实现自启动(除了使用VXD,因为
我弄了很久也不行~~我的水平有限~~~太难了~~~)
对于屏蔽IE的问题,因为用到IE,别人就很容易进入到系统,我是在Timer里FindWindow,
如果有IE则关闭,不知道这样的实现是否可以?
欢迎有做过WinShell的朋友联系我 cornermoss@163.net MSN:zhangxd78@hotmail.com

为什么一直没有人来回答??
 
2k可以做服务程序

FindWindow应该可以

-----
http://www.8421.org
 
我是在win98里做呀,不知道有什么方法没有?

另外,对于在Timer里Findwindow关闭IE的方法,这样是不是很耗系统资源呢?
 
RegisterServiceProcess(dwProcessId,dwType:DWORD):DWORD; StdCall
external 'kernel32.dll' name 'RegisterServiceProcess';

procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterServiceProcess(0,1);
end;

按ctrl+alt+del里面就没有了。
interval设置10秒钟,没事的
 
to qdyoung:把程序注册成服务,如果程序没有完全Creat时,如果动作够快,仍然是可以
用ctrl+alt+del查看到并结束的。再说,我用RunOnce的方法可以解决这个问题(虽然是非
常之麻烦的了~~)。不过不管怎么说,也得谢谢你对本问题的关注^_*
或者大家谈谈美萍启动时用VXD把鼠标限制在某处的实现方法呀(不是在EXE 文件里,我可
以在exe里实现的)。好象美萍是用VXD调用他的smenu.exe的哈?


 
请大家帮帮忙呀~~~先把分加到50再说哈^_*

我现在是这样做的,使用了美萍的Discard.vxd,可以很好地在系统启动的时候屏
蔽Alt+Del+Ctrl,防止结束我的程序;但是现在的问题是,退出我的系统后,怎样
结束Discard.vxd呢?也就是恢复Alt+Del+Ctrl的问题(用SystemParametersInfo
是不能恢复的)
 
9x下SystemParametersInfo可以禁止ctrl+alt+del,为什么还要用vxd
2k下不用vxd的方法我的主页www.8421.org有
不过我还是给你一个2k下动态加载驱动程序的代码,9x下差不多,不过我现在只有c代码:
program DogInst;

uses
Windows, SysUtils, WinSvc;

{$R *.res}
procedure ShowError(sError: string);
begin
MessageBox(0, PChar(sError), '安装错误', MB_OK or MB_ICONSTOP);
end;

function GetLastErrorMessage: string;
var
pMsgBuf: PChar;
begin
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM,
nil, GetLastError(),
GetSystemDefaultLangId,
@pMsgBuf, 0, nil);
Result := pMsgBuf;
LocalFree(HLocal(pMsgBuf));
end;

var
OSStyle: Integer;
m_currentDir, cur_windir, cur_sysdir: string;
procedure init;
var
osver: OSVERSIONINFO;
str: array[0..MAX_PATH] of Char;
begin
m_currentDir := ExtractFilePath(ParamStr(0));
if GetWindowsDirectory(str, SizeOf(str)) = 0 then
raise Exception.Create('GetWindowsDirectory 调用失败');
cur_windir := string(str);
if GetSystemDirectory(str, SizeOf(str)) = 0 then
raise Exception.Create('GetSystemDirectory 调用失败');
cur_sysdir := string(str);

OSStyle := 0;
osver.dwOSVersionInfoSize := SizeOf(OSVERSIONINFO);
GetVersionEx(osver);

case osver.dwPlatformId of
VER_PLATFORM_WIN32_WINDOWS:
if osver.dwMinorVersion = 0 then
OSStyle := 1 // Windows 95
else if osver.dwMinorVersion > 0 then
OSStyle := 2; // Windows 98
VER_PLATFORM_WIN32_NT:
if osver.dwMajorVersion = 5 then
OSStyle := 3 // Windows 2000
else
OSStyle := 4; // Windows NT 4.0 or below
else
Exception.Create('不支持该操作系统论');
end;
end;

procedure m_Copy(const FName: string);
var
b1: Boolean;
wAttr: DWORD;
FNew, FExisting: string;
begin
FExisting := m_currentDir;
if (OSStyle = 1) or (OSStyle = 2) then
FExisting := m_currentDir + 'win9x/' + FName
else if OSStyle = 3 then
FExisting := m_currentDir + 'win2000/' + FName
else if OSStyle = 4 then
FExisting := m_currentDir + 'winnt4/' + FName;
FNew := cur_sysdir + '/' + FName;
b1 := CopyFile(PChar(FExisting), PChar(FNew), FALSE);
if not b1 and (GetLastError = 5) then
begin
wAttr := GetFileAttributes(PChar(FNew));
wAttr := wAttr and not FILE_ATTRIBUTE_READONLY;
SetFileAttributes(PChar(FNew), wAttr);
b1 := CopyFile(PChar(FExisting), PChar(FNew), FALSE);
end;
if not b1 then
raise Exception.Create('复制 ' + FExisting + ' 到 ' + cur_sysdir + ' 失败');
end;

procedure inst2k;
const
DriverName = 'Mhdrv';
HOSTName = 'Hostnt';
var
d_driver: string;
schService: SC_HANDLE;
serviceStatus: SERVICE_STATUS;
SchSCManager: SC_HANDLE;
p: PChar;
dwTag: DWORD;
begin
schSCManager := OpenSCManager(nil, // machine (NULL == local)
nil, // database (NULL == default)
SC_MANAGER_ALL_ACCESS // access required
);
if schSCManager = 0 then
raise Exception.Create('调用01失败');

schService := OpenService (schSCManager, DriverName, SERVICE_ALL_ACCESS);
if schService <> 0 then
begin
if ControlService(schService, SERVICE_CONTROL_STOP, serviceStatus)
or ControlService(schService, SERVICE_CONTROL_STOP, serviceStatus) then
begin
while(QueryServiceStatus(schService, serviceStatus)) do
if(serviceStatus.dwCurrentState = SERVICE_STOP_PENDING) then
Sleep(1000)
else
Break;
end;
if not DeleteService(schService) then
ShowError('出现错误001:' + GetLastErrorMessage);
CloseServiceHandle(schService);
end;

schService := OpenService (schSCManager, HOSTName, SERVICE_ALL_ACCESS);
if schService <> 0 then
begin
if ControlService(schService, SERVICE_CONTROL_STOP, serviceStatus)
or ControlService(schService, SERVICE_CONTROL_STOP, serviceStatus) then
begin
while(QueryServiceStatus(schService, serviceStatus)) do
if(serviceStatus.dwCurrentState = SERVICE_STOP_PENDING) then
Sleep(1000)
else
Break;
end;
if not DeleteService(schService) then
ShowError('出现错误003:' + GetLastErrorMessage);
CloseServiceHandle(schService);
end;

d_driver := cur_sysdir;
cur_sysdir := cur_windir;
cur_sysdir := cur_windir + '/inf';
m_Copy('gsmhwdm.inf');

cur_sysdir := d_driver + '/drivers';
m_Copy('gsmhwdm.sys');
m_Copy('mhdrv.sys');
m_Copy('hostnt.sys');

dwTag := 2;
d_driver := cur_sysdir + '/mhdrv.sys';
schService := CreateService(SchSCManager, // SCManager database
DriverName, // name of service
DriverName, // name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_KERNEL_DRIVER, // service type
SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL, // error control type
PChar(d_driver), // service's binary
'Extended base', // no load ordering group
@dwTag, // no tag identifier
'Parport'#0, // no dependencies
nil, // LocalSystem account
nil // no password
);
p := nil;
if schService <> 0 then
begin
CloseServiceHandle(schService);
if StartService(schService, 0, p) then Exit;
end;
schService := OpenService(SchSCManager,
DriverName,
SERVICE_ALL_ACCESS
);
if schService = 0 then
raise Exception.Create('调用25失败');
if not StartService(schService, 0, p) then
raise Exception.Create('调用26失败');
CloseServiceHandle(schService);

//OPEN-HOSTID--------------------
d_driver := cur_sysdir + '/hostnt.sys';
schService := CreateService(SchSCManager, // SCManager database
HOSTName, // name of service
HOSTName, // name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_KERNEL_DRIVER, // service type
SERVICE_AUTO_START, // start type
SERVICE_ERROR_NORMAL, // error control type
PChar(d_driver), // service's binary
'Extended base', // no load ordering group
@dwTag, // no tag identifier
nil, // no dependencies
nil, // LocalSystem account
nil // no password
);
if schService <> 0 then
begin
CloseServiceHandle(schService);
if StartService(schService, 0, p) then Exit;
end;

schService := OpenService(SchSCManager,
HOSTName,
SERVICE_ALL_ACCESS
);
if schService = 0 then
raise Exception.Create('调用27失败');
if not StartService(schService, 0, p) then
raise Exception.Create('调用28失败');
CloseServiceHandle(schService);
CloseServiceHandle(SchSCManager);
end;

begin
try
init;
inst2k;
except
on E: Exception do
ShowError(E.Message + ':' + GetLastErrorMessage);
end;
end.

另一个动态加载vxd的c例子见:
http://www.sysinternals.com/ntw2k/source/regmon.shtml
 
今天又试了一下,原来Discal.VXD(前面打错了)在系统完全启动后
(也可能是在一个时间段后)可以自己结束并恢复Alt+Ctrl+Del的。

非常十分感谢qdyoung的帮助,现在结贴。

to qdyoung:如果你有去csdn的话,请去
http://www.csdn.net/Expert/TopicView1.asp?id=826812 接分(中午12点后结贴)
 
没去。不客气
 
后退
顶部