windows下加入删除服务

#include <windows.h>
#include <stdio.h>
#define ____DEVICE_BASENAME			("myfirst")

//
//	Get system error message string
//
PCSTR SystemMessage(
	DWORD			nError)
{
	static CHAR		msg[256];

	if (!FormatMessage(
		FORMAT_MESSAGE_FROM_SYSTEM |
		FORMAT_MESSAGE_IGNORE_INSERTS,
		NULL, nError, 0, msg, sizeof(msg), NULL)) {

		_snprintf(msg, sizeof(msg),
			"Unknown system error %lu (0x%08x)\n", nError, nError);
	}
	return msg;
}

DWORD WINAPI InstallDriver(
	PSTR			inst_path,
	DWORD			nStart)
{
	DWORD			ret = ERROR_SUCCESS;
	SC_HANDLE		hScManager;				// Service Control Manager
	SC_HANDLE		hService = NULL;		// Service (= Driver)
	
	// Connect to the Service Control Manager
	hScManager = OpenSCManager(
		NULL,							// local machine
		NULL,							// local database
		SC_MANAGER_CREATE_SERVICE);		// access required
	if (hScManager == NULL)
	{
		ret = GetLastError();
		fprintf(stderr, "failed to connect scm: %s\n", SystemMessage(ret));
		goto cleanup;
	}

	// Create a new service object
	hService = CreateService(
		hScManager,						// service control manager
		____DEVICE_BASENAME,			// internal service name
		____DEVICE_BASENAME,			// display name
		SERVICE_ALL_ACCESS,				// access mode
		SERVICE_KERNEL_DRIVER,			// service type
		nStart,							// service start type
		SERVICE_ERROR_NORMAL,			// start error sevirity
		inst_path,						// service image file path
		NULL,							// service group
		NULL,							// service tag
		NULL,							// service dependency
		NULL,							// use LocalSystem account
		NULL							// password for the account
	);
	if (!hService)
	{
		// Failed to create a service object
		ret = GetLastError();
		fprintf(stderr, "failed to create service: %s\n", SystemMessage(ret));
		goto cleanup;
	}
cleanup:
	//	Close the service object handle
	if (hService) {
		CloseServiceHandle(hService);
	}
	//	Close handle to the service control manager.
	if (hScManager) {
		CloseServiceHandle(hScManager);
	}
	return ret;
}

DWORD WINAPI RemoveDriver()
{
	SC_HANDLE		hScManager;				// Service Control Manager
	SC_HANDLE		hService;				// Service (= Driver)
	DWORD			ret = ERROR_SUCCESS;

	//	Connect to the Service Control Manager
	hScManager = OpenSCManager(NULL, NULL, 0);
	if (hScManager == NULL)
	{
		ret = GetLastError();
		fprintf(stderr, "failed to open scm: %s\n", SystemMessage(ret));
		return ret;
	}

	//	Open the VFD driver entry in the service database
	hService = OpenService(
		hScManager,						// Service control manager
		____DEVICE_BASENAME,			// service name
		DELETE);						// service access mode

	if (hService == NULL)
	{
		ret = GetLastError();
		fprintf(stderr, "failed to open service: %s\n", SystemMessage(ret));
		goto cleanup;
	}

	//	Remove driver entry from registry
	if (!DeleteService(hService))
	{
		ret = GetLastError();
		fprintf(stderr, "failed to delete service: %s\n", SystemMessage(ret));
		goto cleanup;
	}

cleanup:
	//	Close the service object handle
	if (hService) {
		CloseServiceHandle(hService);
	}
	//	Close handle to the service control manager.
	if (hScManager) {
		CloseServiceHandle(hScManager);
	}
	return ret;
}

int main(int argc, const char* argv[])
{
	CHAR			system_dir[MAX_PATH];
	GetWindowsDirectory(system_dir, sizeof(system_dir));
	fprintf(stderr, "%s\n", system_dir);

	// use full path!!!
	if(argc < 2)
		return 1;
	
	switch(argv[1][0])
	{
	case 'i':
		if(InstallDriver("first.sys", SERVICE_DEMAND_START))
		{
			printf("install error\n");
			return 1;
		}
		break;
	case 'r':
		if(RemoveDriver())
		{
			printf("remove error\n");
			return 1;
		}
		break;
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Windows中,可以使用以下命令来删除目录下的所有文件: DEL /F/Q/S *.* 这个命令会删除指定目录下的所有文件,包括子目录中的文件。其中,/F参数表示强制删除文件,/Q参数表示静默删除文件,/S参数表示递归删除子目录中的文件。通过执行这个命令,可以快速删除目录下的所有文件。\[1\] 另外,如果你想避免在删除过程中输出任何信息,可以使用以下命令: DEL /F/Q/S *.* > NUL 这个命令会将删除过程中的输出重定向到NUL设备,从而避免在命令行中显示任何信息。\[1\] 如果你希望在右击菜单中加入快速删除选项,可以通过以下步骤实现: 1. 打开注册表编辑器,可以通过按下Win + R键,然后输入regedit并回车来打开。 2. 在注册表编辑器中,找到HKEY_CLASSES_ROOT\Directory\shell目录。 3. 在shell目录上右击,选择新建项,并输入一个名称,比如"快速删除"。 4. 在刚刚创建的项下,再次右击,选择新建项,并输入"command"作为名称。 5. 双击刚刚创建的command项,在数值数据中输入以下命令:cmd /c "cd %1 && DEL /F/Q/S *.*"。如果你没有将删除命令所在的路径添加到系统环境变量中的PATH中,需要将命令的绝对路径替换为"删除命令的绝对路径"。 6. 点击确定,完成设置。 完成以上步骤后,你就可以在右击菜单中看到"快速删除"选项,点击该选项即可快速删除目录下的所有文件。\[3\] #### 引用[.reference_title] - *1* *2* *3* [Windows下快速删除上万个文件和子目录(快速删除文件) 命令行cmd快速删除文件夹](https://blog.csdn.net/xiaoerbuyu1233/article/details/108490963)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值