发新话题
打印

[转载]远程打开telnet服务opentelnet程序代码

[转载]远程打开telnet服务opentelnet程序代码

信息来源:refdom

opentelnet.cpp
复制内容到剪贴板
代码:
////////////////////////////////////////////////////////////////////////////////
//   
//    Telnet Remote Configure And Wake Up
//   
//    File    : OpenTelnet.cpp
//    Version  : 0.5
//    Comment  : only for win2k and XP(pro\server\adv)
//   
//    Create at : 2002.3.8
//    Create by : refdom
//        Email      : [email]refdom@263.net[/email]
//        Home Page : [url]www.opengram.com[/url]
//
//        If you modify the code, or add more functions, please email me a copy.
//   
////////////////////////////////////////////////////////////////////////////////

#include <stdio.h>
#include <assert.h>
#include <windows.h>
#include <Winnetwk.h>
#include <Winreg.h>
#include <Shlwapi.h>

#pragma comment(lib, "Advapi32.lib")
#pragma comment(lib, "Mpr.lib")

SC_HANDLE    g_schSCManager;
HKEY        g_hKey;
DWORD        g_DefaultTelnetStartType;
DWORD        g_DefaultRegistryStartType;
LPBYTE        g_lpDefaultTelnetNTLM;
LPBYTE        g_lpDefaultTelnetPort;

void Usage(char*);
int RestartTelnet();
int StartRemoteRegistry();
int MyStartService(SC_HANDLE, char*);


int main(int argc, char* argv[])
{
    int nRetCode;
    char szIpc[50] = "";
    HKEY hKey;
    LPSTR lpUserName, lpPassword;
    NETRESOURCE NET;

    DWORD dwNTLM, dwTelnetPort;

    Usage(argv[0]);
    if (argc < 5)
        return 0;

    sprintf (szIpc, "%s\\ipc$", argv[1]);
    lpUserName = argv[2];
    lpPassword = argv[3];

    NET.lpLocalName = NULL;
    NET.lpRemoteName = szIpc;
    NET.dwType = RESOURCETYPE_ANY;
    NET.lpProvider = NULL;

    printf ("Connecting %s...",argv[1]);

ReConnect:

    nRetCode = WNetCancelConnection2(szIpc, CONNECT_UPDATE_PROFILE, TRUE);
    if (nRetCode == NO_ERROR)
        printf ("Canncel Successfully!\n");

    nRetCode = WNetAddConnection2(&NET, lpPassword, lpUserName, CONNECT_INTERACTIVE);
    if (nRetCode == ERROR_ALREADY_ASSIGNED || nRetCode == ERROR_DEVICE_ALREADY_REMEMBERED)
    {
        printf ("Already conneted to the server!\n");
        printf ("Now re-connecting the server...\n");
        goto ReConnect;
    }
    else if (nRetCode == NO_ERROR)
        printf ("Successfully!\n");
    else
    {
        printf ("\n\tErr:");
        switch (nRetCode)
        {
        case ERROR_ALREADY_ASSIGNED:


        case ERROR_ACCESS_DENIED:
            printf ("ERROR_ACCESS_DENIED\n");
            break;
        case ERROR_BAD_NET_NAME:
            printf ("ERROR_BAD_NET_NAME\n");
            break;
        default:
            printf ("CONNECT ERR:%d!\n",GetLastError());
            break;
        }
        return 0;
    }

    //open SCManager
    g_schSCManager = OpenSCManager(argv[1], NULL, SC_MANAGER_ALL_ACCESS);
    if (g_schSCManager == NULL)
    {
        printf ("Open SCManager failed!\n");
        return 0;
    }

    //check remote registry service is running
    if (!StartRemoteRegistry())
    {
        printf ("All Process Failed!\n");
        return 0;
    }

    //open the registry
    if (!(RegConnectRegistry((LPCTSTR) argv[1], HKEY_LOCAL_MACHINE, &g_hKey) == ERROR_SUCCESS))
    {
        printf ("Connect remote registry failed!\n");
        return 0;
    }

    if (!(RegOpenKeyEx(g_hKey, "SOFTWARE\\Microsoft\\TelnetServer\\1.0", 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS))
    {
        printf ("Open key failed!\n");
        return 0;
    }

    //read the registry for default config
    g_lpDefaultTelnetNTLM = (LPBYTE) LocalAlloc(LPTR, 50);
    g_lpDefaultTelnetPort = (LPBYTE) LocalAlloc(LPTR, 50);
    DWORD dwDataSize = 50;
    if (!(RegQueryValueEx(hKey, "NTLM", NULL, NULL, g_lpDefaultTelnetNTLM, &dwDataSize) == ERROR_SUCCESS))
    {
        printf ("Read NTLM failed!\n ");
        return 0;
    }
    if (!(RegQueryValueEx(hKey, "TelnetPort", NULL, NULL, g_lpDefaultTelnetPort, &dwDataSize) == ERROR_SUCCESS))
    {
        printf ("Read port failed!\n ");
        return 0;
    }

    //edit the registry
    dwNTLM = atoi(argv[4]);
    if (dwNTLM >= 3)
    {
        dwNTLM = 1;
    }
    dwTelnetPort = atoi(argv[5]);

    if (!(RegSetValueEx(hKey, "NTLM", 0, REG_DWORD, (LPBYTE) &dwNTLM, sizeof(DWORD)) == ERROR_SUCCESS))
    {
        printf ("Set NTLM value failed!");
        return 0;
    }

    RegSetValueEx(hKey, "TelnetPort", 0, REG_DWORD, (LPBYTE) &dwTelnetPort, sizeof(DWORD));

    //restart telnet service
    nRetCode = RestartTelnet();

    if (nRetCode)
    {
        printf ("\nBINGLE!!!Yeah!!\n");
        printf ("Telnet Port is %d. You can try:\"telnet ip %d\", to connect the server!", dwTelnetPort, dwTelnetPort);
    }

    //remain the default setting
    if (!(RegSetValueEx(hKey, "default_NTLM", 0, REG_DWORD, g_lpDefaultTelnetNTLM, sizeof(DWORD)) == ERROR_SUCCESS))
    {
        printf ("Set defaultNTLM value failed!");
        return 0;
    }
    if (!(RegSetValueEx(hKey, "default_Port", 0, REG_DWORD, g_lpDefaultTelnetPort, sizeof(DWORD)) == ERROR_SUCCESS))
    {
        printf ("Set defaultPort value failed!");
        return 0;
    }
    if (!(RegSetValueEx(hKey, "default_TelnetStart", 0, REG_DWORD, (LPBYTE) &g_DefaultTelnetStartType, sizeof(DWORD)) == ERROR_SUCCESS))
    {
        printf ("Set defaulttelnetstart value failed!");
        return 0;
    }
    if (!(RegSetValueEx(hKey, "default_RegistryStart", 0, REG_DWORD, (LPBYTE) &g_DefaultRegistryStartType, sizeof(DWORD)) == ERROR_SUCCESS))
    {
        printf ("Set defaultregistrystart value failed!");
        return 0;
    }

    RegCloseKey(hKey);
    RegCloseKey(g_hKey);
    //close SCManager
    CloseServiceHandle(g_schSCManager);

    //close the session with remote server
    printf ("\nDisconnecting server...");
    nRetCode = WNetCancelConnection2(argv[1], CONNECT_UPDATE_PROFILE, TRUE);
    if (nRetCode == NO_ERROR)
        printf ("Successfully!\n");
    else
        printf ("Failed!\n");

    return 0;
}

void Usage(char* pcAppName)
{
    printf ("*******************************************************\n");
    printf ("Remote Telnet Configure, by refdom\n");
    printf ("Email: [email]refdom@263.net[/email]\n");
    printf ("%s\n\n", pcAppName);
    printf ("Usage:OpenTelnet.exe \\\\server username password NTLMAuthor telnetport\n");
    printf ("*******************************************************\n");
    return;
}

int RestartTelnet()
{
    DWORD                    dwWaitTime;
    DWORD                    dwConfigSize;
    SC_HANDLE                schTelnetService;
    SERVICE_STATUS            ssTelnetStatus;
    LPQUERY_SERVICE_CONFIG    lpTelnetConfig;

    printf ("\nNOTICE!!!!!!\n");
    printf ("The Telnet Service default setting:NTLMAuthor=2  TelnetPort=23\n\n");

    //stop the telnet service
    schTelnetService = OpenService(g_schSCManager, "TlntSvr", SERVICE_ALL_ACCESS);
    if (schTelnetService == NULL)
    {
        printf ("Open service failed!\n");
        return 0;
    }

    lpTelnetConfig = (LPQUERY_SERVICE_CONFIG) LocalAlloc(LPTR, 1024);
    if (lpTelnetConfig == NULL)
    {
        printf ("Alloc memory failed!\n");
        return 0;
    }

    if (!QueryServiceConfig(schTelnetService, lpTelnetConfig, 1024, &dwConfigSize))
    {
        printf ("Query service congfig failed!\n");
        return 0;
    }

    //remain the fault start ytpe of telnet service
    g_DefaultTelnetStartType = lpTelnetConfig->dwStartType;

    //change the start type of the telnet service
    if (lpTelnetConfig->dwStartType == SERVICE_DISABLED)
    {
        if (!ChangeServiceConfig(schTelnetService,
                                SERVICE_NO_CHANGE,
                                SERVICE_DEMAND_START,
                                SERVICE_NO_CHANGE,
                                NULL, NULL, NULL, NULL, NULL, NULL, NULL))
        {
            printf ("Change service config failed!\n");
            return 0;
        }
    }

    if (!(QueryServiceStatus(schTelnetService, &ssTelnetStatus)))
    {
        printf ("Query service status failed!\n");
        return 0;
    }

    if (ssTelnetStatus.dwCurrentState != SERVICE_STOPPED && ssTelnetStatus.dwCurrentState != SERVICE_STOP_PENDING)
    {
        printf ("Stopping telnet service ...\n");
        if (!(ControlService(schTelnetService, SERVICE_CONTROL_STOP, &ssTelnetStatus)))
        {
            printf ("Control telnet service status failed!\n");
            return 0;
        }

        dwWaitTime = ssTelnetStatus.dwWaitHint / 10;
        if( dwWaitTime < 1000 )
            dwWaitTime = 1000;
        else if ( dwWaitTime > 10000 )
            dwWaitTime = 10000;

        Sleep(dwWaitTime);
        if (!QueryServiceStatus(schTelnetService, &ssTelnetStatus))
        {
            printf ("Query service status failed!\n");
        }

        if ( ssTelnetStatus.dwCurrentState == SERVICE_STOPPED || ssTelnetStatus.dwCurrentState == SERVICE_STOP_PENDING)
        {
            printf ("Telnet service is stopped successfully!\n");
        }
        else
        {
            printf ("Stopping telnet service failed!\n");
            return 0;
        }
    }

    //start the telnet service

    if (!MyStartService(schTelnetService, "telnet"))
        return 0;

    CloseServiceHandle(schTelnetService);
    return 1;
}

int StartRemoteRegistry()
{
    SC_HANDLE schRegistryService;
    SERVICE_STATUS ssRegistryStatus;
    LPQUERY_SERVICE_CONFIG lpRegistryConfig;
    DWORD dwConfigSize;

    lpRegistryConfig = (LPQUERY_SERVICE_CONFIG) LocalAlloc(LPTR, 1024);
    if (lpRegistryConfig == NULL)
    {
        printf ("Alloc memory failed!\n");
        return 0;
    }

    schRegistryService = OpenService( g_schSCManager, "RemoteRegistry", SERVICE_ALL_ACCESS);
    if (schRegistryService == NULL)
    {
        printf ("Open remote registry service failed!\n");
        return 0;
    }

    if (!QueryServiceConfig(schRegistryService, lpRegistryConfig, 1024, &dwConfigSize))
    {
        printf ("Query registry service config failed!\n");
        return 0;
    }

    g_DefaultRegistryStartType = lpRegistryConfig->dwStartType;
    if (g_DefaultRegistryStartType == SERVICE_DISABLED)
    {
        if (!ChangeServiceConfig(schRegistryService,
                                SERVICE_NO_CHANGE,
                                SERVICE_DEMAND_START,
                                SERVICE_NO_CHANGE,
                                NULL, NULL, NULL, NULL, NULL, NULL,NULL))
        {
            printf ("Change registry service config failed!\n");
            return 0;
        }
    }

    if (!QueryServiceStatus(schRegistryService, &ssRegistryStatus))
    {
        printf ("Query remote registry service failed!\n");
        return 0;
    }

    if (ssRegistryStatus.dwCurrentState != SERVICE_RUNNING)
    {
        if (!MyStartService(schRegistryService, "remote registry"))
            return 0;
    }
    CloseServiceHandle(schRegistryService);
    return 1;
}

int MyStartService(SC_HANDLE schService, char* szServiceName)
{
    DWORD dwWaitTime;
    DWORD dwOldCheckPoint;
    DWORD dwStartTickCount;
    SERVICE_STATUS ssStatus;

    printf ("Starting %s service...\n", szServiceName);
    if (!(StartService(schService, 0, NULL)))
    {
        printf ("Starting %s service failed!\n", szServiceName);
        return 0;
    }

    if (!(QueryServiceStatus(schService, &ssStatus)))
    {
        printf ("Query %s service status failed!\n",szServiceName);
//        return ;
    }

   dwStartTickCount = GetTickCount();
   dwOldCheckPoint = ssStatus.dwCheckPoint;

    while ( ssStatus.dwCurrentState == SERVICE_START_PENDING)
    {
        dwWaitTime = ssStatus.dwWaitHint / 10;
      if( dwWaitTime < 1000 )
        dwWaitTime = 1000;
      else if ( dwWaitTime > 10000 )
        dwWaitTime = 10000;

        Sleep(dwWaitTime);

      // Check the status again.

      if (!QueryServiceStatus(schService, &ssStatus))
        break;

      if ( ssStatus.dwCheckPoint > dwOldCheckPoint )
      {
        // The service is making progress.
        dwStartTickCount = GetTickCount();
        dwOldCheckPoint = ssStatus.dwCheckPoint;
      }
      else
      {
        if(GetTickCount()-dwStartTickCount > ssStatus.dwWaitHint)
        {
           // No progress made within the wait hint
           break;
        }
      }
    }

    if ( ssStatus.dwCurrentState == SERVICE_RUNNING )
    {
        printf ("%s service is started successfully! %s service is running!\n", szServiceName, szServiceName);
    }
    else
    {
        printf ("%s service is not started!\n", szServiceName);
        return 0;
    }

    return 1;
}
resumetelnet.cpp
复制内容到剪贴板
代码:
////////////////////////////////////////////////////////////////////////////////
//   
//    Resume Telnet Remote Config
//   
//    File    : ReumeTelnet.cpp
//    Version  : 0.5
//    Comment  : only for win2k and XP(pro\server\adv)
//   
//    Create at : 2002.3.9
//    Create by : refdom
//        Email      : [email]refdom@263.net[/email]
//        Home Page : [url]www.opengram.com[/url]
//
//        If you modify the code, or add more functions, please email me a copy.
//   
////////////////////////////////////////////////////////////////////////////////

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

#pragma comment(lib, "Advapi32.lib")
#pragma comment(lib, "Mpr.lib")

SC_HANDLE    g_schSCManager;
SC_HANDLE  g_schRegistryService;
HKEY        g_hKey;
DWORD        g_DefaultTelnetStartType = 0;
DWORD        g_DefaultRegistryStartType = 0;
LPBYTE        g_lpDefaultTelnetNTLM;
LPBYTE        g_lpDefaultTelnetPort;

void Usage(char*);
int CloseTelnet();
int StartRemoteRegistry();
int MyStartService(SC_HANDLE, char*);
int ResumeRegistryService();

int main(int argc, char* argv[])
{
    int nRetCode;
    char szIpc[50] = "";
    HKEY hKey;
    LPSTR lpUserName, lpPassword;
    NETRESOURCE NET;

    Usage(argv[0]);
    if (argc != 4)
        return 0;

    sprintf (szIpc, "%s\\ipc$", argv[1]);
    lpUserName = argv[2];
    lpPassword = argv[3];

    NET.lpLocalName = NULL;
    NET.lpRemoteName = szIpc;
    NET.dwType = RESOURCETYPE_ANY;
    NET.lpProvider = NULL;

    printf ("Connecting %s...",argv[1]);

ReConnect:

    nRetCode = WNetCancelConnection2(szIpc, CONNECT_UPDATE_PROFILE, TRUE);
    if (nRetCode == NO_ERROR)
        printf ("Canncel Successfully!\n");

    nRetCode = WNetAddConnection2(&NET, lpPassword, lpUserName, CONNECT_INTERACTIVE);
    if (nRetCode == ERROR_ALREADY_ASSIGNED || nRetCode == ERROR_DEVICE_ALREADY_REMEMBERED)
    {
        printf ("Already conneted to the server!\n");
        printf ("Now re-connecting the server...\n");
        goto ReConnect;
    }
    else if (nRetCode == NO_ERROR)
        printf ("Successfully!\n");
    else
    {
        printf ("\n\tErr:");
        switch (nRetCode)
        {
        case ERROR_ACCESS_DENIED:
            printf ("ERROR_ACCESS_DENIED\n");
            break;
        case ERROR_BAD_NET_NAME:
            printf ("ERROR_BAD_NET_NAME\n");
            break;
        default:
            printf ("CONNECT ERR:%d!\n",GetLastError());
            break;
        }
        return 0;
    }

    //open SCManager
    g_schSCManager = OpenSCManager(argv[1], NULL, SC_MANAGER_ALL_ACCESS);
    if (g_schSCManager == NULL)
    {
        printf ("Open SCManager failed!\n");
        return 0;
    }

    //check remote registry service is running
    if (!StartRemoteRegistry())
    {
        printf ("All Process Failed!\n");
        return 0;
    }

    //edit the registry
    if (!(RegConnectRegistry((LPCTSTR) argv[1], HKEY_LOCAL_MACHINE, &g_hKey) == ERROR_SUCCESS))
    {
        printf ("Connect remote registry failed!\n");
        return 0;
    }

    if (!(RegOpenKeyEx(g_hKey, "SOFTWARE\\Microsoft\\TelnetServer\\1.0", 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS))
    {
        printf ("Open key failed!\n");
        return 0;
    }

    //read the registry for default config
    g_lpDefaultTelnetNTLM = (LPBYTE) LocalAlloc(LPTR, 50);
    g_lpDefaultTelnetPort = (LPBYTE) LocalAlloc(LPTR, 50);
    DWORD dwDataSize = 50;
    if (!(RegQueryValueEx(hKey, "default_NTLM", NULL, NULL, g_lpDefaultTelnetNTLM, &dwDataSize) == ERROR_SUCCESS))
    {
        printf ("Read NTLM failed!\n ");
        printf ("%d\n", GetLastError());
        return 0;
    }
    if (!(RegQueryValueEx(hKey, "default_Port", NULL, NULL, g_lpDefaultTelnetPort, &dwDataSize) == ERROR_SUCCESS))
    {
        printf ("Read port failed!\n ");
        return 0;
    }
    if (!(RegQueryValueEx(hKey, "default_RegistryStart", NULL, NULL, (LPBYTE) &g_DefaultRegistryStartType, &dwDataSize) == ERROR_SUCCESS))
    {
        printf ("Read registrystart failed!\n ");
        return 0;
    }
    if (!(RegQueryValueEx(hKey, "default_TelnetStart", NULL, NULL, (LPBYTE) &g_DefaultTelnetStartType, &dwDataSize) == ERROR_SUCCESS))
    {
        printf ("Read telnetstart failed!\n ");
        return 0;
    }
    if (!(RegSetValueEx(hKey, "NTLM", 0, REG_DWORD, g_lpDefaultTelnetNTLM, sizeof(DWORD)) == ERROR_SUCCESS))
    {
        printf ("Set NTLM failed!");
        return 0;
    }

    if (!(RegSetValueEx(hKey, "TelnetPort", 0, REG_DWORD, g_lpDefaultTelnetPort, sizeof(DWORD)) == ERROR_SUCCESS))
    {
        printf ("Set port failed!");
        return 0;
    }

    //close telnet service
    nRetCode = CloseTelnet();

    if (nRetCode)
    {
        printf ("\nBINGLE!!!\n");
        printf ("The config of remote telnet server is resumed!\n");
    }

    //resume the configure
    if (!(RegDeleteValue(hKey, (LPCTSTR) "default_NTLM") == ERROR_SUCCESS))
        printf ("Delete NTLM value failed!\n");
    if (!(RegDeleteValue(hKey, (LPCTSTR) "default_Port") == ERROR_SUCCESS))
        printf ("Delete port value failed!\n");
    if (!(RegDeleteValue(hKey, (LPCTSTR) "default_RegistryStart") == ERROR_SUCCESS))
        printf ("Delete registrystart value failed!\n");
    if (!(RegDeleteValue(hKey, (LPCTSTR) "default_TelnetStart") == ERROR_SUCCESS))
        printf ("Delete telnetstart value failed!\n");

    RegCloseKey(hKey);
    RegCloseKey(g_hKey);

    ResumeRegistryService();
    CloseServiceHandle(g_schRegistryService);
    //close SCManager
    CloseServiceHandle(g_schSCManager);

    //close the session with remote server
    printf ("\nDisconnecting server...");
    nRetCode = WNetCancelConnection2(argv[1], CONNECT_UPDATE_PROFILE, TRUE);
    if (nRetCode == NO_ERROR)
        printf ("Successfully!\n");
    else
        printf ("Failed!\n");

    LocalFree(g_lpDefaultTelnetNTLM);
    LocalFree(g_lpDefaultTelnetPort);

    return 0;
}

void Usage(char* pcAppName)
{
    printf ("*******************************************************\n");
    printf ("Resume Remote Telnet Config, by refdom\n");
    printf ("Email: [email]refdom@263.net[/email]\n");
    printf ("%s\n\n", pcAppName);
    printf ("Usage:ResumeTelnet.exe \\\\server username password\n");
    printf ("*******************************************************\n");
    return;
}

int CloseTelnet()
{
    DWORD                    dwWaitTime;
    DWORD                    dwConfigSize;
    SC_HANDLE                schTelnetService;
    SERVICE_STATUS            ssTelnetStatus;
    LPQUERY_SERVICE_CONFIG    lpTelnetConfig;

    //stop the telnet service
    schTelnetService = OpenService(g_schSCManager, "TlntSvr", SERVICE_ALL_ACCESS);
    if (schTelnetService == NULL)
    {
        printf ("Open service failed!\n");
        return 0;
    }

    lpTelnetConfig = (LPQUERY_SERVICE_CONFIG) LocalAlloc(LPTR, 1024);
    if (lpTelnetConfig == NULL)
    {
        printf ("Alloc memory failed!\n");
        return 0;
    }
    if (!QueryServiceConfig(schTelnetService, lpTelnetConfig, 1024, &dwConfigSize))
    {
        printf ("Query service congfig failed!\n");
        return 0;
    }

    if (lpTelnetConfig->dwStartType != g_DefaultTelnetStartType)
    {
        if (!ChangeServiceConfig(schTelnetService,
                            SERVICE_NO_CHANGE,
                            g_DefaultTelnetStartType,
                            SERVICE_NO_CHANGE,
                            NULL, NULL, NULL, NULL, NULL, NULL, NULL))
        {
            printf ("Set telnet start type error!\n");
            return 0;
        }
    }

    if (!(QueryServiceStatus(schTelnetService, &ssTelnetStatus)))
    {
        printf ("Query service status failed!\n");
        return 0;
    }

    if (ssTelnetStatus.dwCurrentState != SERVICE_STOPPED && ssTelnetStatus.dwCurrentState != SERVICE_STOP_PENDING)
    {
        printf ("Stopping telnet service ...\n");
        if (!(ControlService(schTelnetService, SERVICE_CONTROL_STOP, &ssTelnetStatus)))
        {
            printf ("Control telnet service status failed!\n");
            return 0;
        }

        dwWaitTime = ssTelnetStatus.dwWaitHint / 10;
        if( dwWaitTime < 1000 )
            dwWaitTime = 1000;
        else if ( dwWaitTime > 10000 )
            dwWaitTime = 10000;

        Sleep(dwWaitTime);
        if (!QueryServiceStatus(schTelnetService, &ssTelnetStatus))
        {
            printf ("Query service status failed!\n");
        }

        if ( ssTelnetStatus.dwCurrentState == SERVICE_STOPPED || ssTelnetStatus.dwCurrentState == SERVICE_STOP_PENDING)
        {
            printf ("Telnet service is stopped successfully!\n");
        }
        else
        {
            printf ("Stopping telnet service failed!\n");
            return 0;
        }
    }

    LocalFree(lpTelnetConfig);
    CloseServiceHandle(schTelnetService);
    return 1;
}

int StartRemoteRegistry()
{
    SC_HANDLE                schRegistryService;
    SERVICE_STATUS            ssRegistryStatus;

    schRegistryService = OpenService( g_schSCManager, "RemoteRegistry", SERVICE_ALL_ACCESS);
    g_schRegistryService = OpenService( g_schSCManager, "RemoteRegistry", SERVICE_ALL_ACCESS);;

    if (schRegistryService == NULL || g_schRegistryService == NULL)
    {
        printf ("Open remote registry service failed!\n");
        return 0;
    }

    if (!QueryServiceStatus(schRegistryService, &ssRegistryStatus))
    {
        printf ("Query remote registry service failed!\n");
        return 0;
    }

    if (ssRegistryStatus.dwCurrentState != SERVICE_RUNNING)
    {
        if (!MyStartService(schRegistryService, "remote registry"))
            return 0;
    }

    CloseServiceHandle(schRegistryService);
    return 1;
}

int MyStartService(SC_HANDLE schService, char* szServiceName)
{
    DWORD dwWaitTime;
    DWORD dwOldCheckPoint;
    DWORD dwStartTickCount;
    SERVICE_STATUS ssStatus;

    printf ("Starting %s service...\n", szServiceName);
    if (!(StartService(schService, 0, NULL)))
    {
        printf ("Starting %s service failed!\n", szServiceName);
        return 0;
    }

    if (!(QueryServiceStatus(schService, &ssStatus)))
    {
        printf ("Query %s service status failed!\n",szServiceName);
//        return ;
    }

   dwStartTickCount = GetTickCount();
   dwOldCheckPoint = ssStatus.dwCheckPoint;

    while ( ssStatus.dwCurrentState == SERVICE_START_PENDING)
    {
        dwWaitTime = ssStatus.dwWaitHint / 10;
      if( dwWaitTime < 1000 )
        dwWaitTime = 1000;
      else if ( dwWaitTime > 10000 )
        dwWaitTime = 10000;

        Sleep(dwWaitTime);

      // Check the status again.

      if (!QueryServiceStatus(schService, &ssStatus))
        break;

      if ( ssStatus.dwCheckPoint > dwOldCheckPoint )
      {
        // The service is making progress.
        dwStartTickCount = GetTickCount();
        dwOldCheckPoint = ssStatus.dwCheckPoint;
      }
      else
      {
        if(GetTickCount()-dwStartTickCount > ssStatus.dwWaitHint)
        {
           // No progress made within the wait hint
           break;
        }
      }
    }

    if ( ssStatus.dwCurrentState == SERVICE_RUNNING )
    {
        printf ("%s service is started successfully! %s service is running!\n", szServiceName, szServiceName);
    }
    else
    {
        printf ("%s service is not started!\n", szServiceName);
        return 0;
    }

    return 1;
}

int ResumeRegistryService()
{
    LPQUERY_SERVICE_CONFIG    lpRegistryConfig;
    DWORD                    dwConfigSize;

    lpRegistryConfig = (LPQUERY_SERVICE_CONFIG) LocalAlloc(LPTR, 1024);
    if (lpRegistryConfig == NULL)
    {
        printf ("Alloc memory failed!\n");
        return 0;
    }
    if (!QueryServiceConfig(g_schRegistryService, lpRegistryConfig, 1024, &dwConfigSize))
    {
        printf ("Query registry service congfig failed!\n");
        printf ("%d\n",GetLastError());
        return 0;
    }

    if (lpRegistryConfig->dwStartType != g_DefaultRegistryStartType)
    {
        if (!ChangeServiceConfig(g_schRegistryService,
                                SERVICE_NO_CHANGE,
                                g_DefaultRegistryStartType,
                                SERVICE_NO_CHANGE,
                                NULL, NULL, NULL, NULL, NULL, NULL, NULL))
        {
            printf ("Set registry start type error!\n");
            return 0;
        }
    }

    LocalFree(lpRegistryConfig);
    return 1;
}
qq310926是我唯一用号,除此之外有其他号码号自称邪八冰血封情,则非本人。

TOP

发新话题