C# DriverControl

WebDriver C#版本 这次提供是是一个WebDriver的C#的3.6.0版本,官网原本。。。。。 立即下载
class DriverControl
{
	private IntPtr hSCManager;
	private IntPtr hService;
	private IntPtr hDevice;
	private uint dwErrorCode;

	public const int MAX_SERVICE_NAME = 256;
	public const int MAX_DISPLAY_NAME = 256;
	public const int MAX_PATH_LENGTH = 260;

	private void initialize()
	{
		hSCManager = Advapi32.OpenSCManager(null, null, Advapi32.SC_MANAGER_ALL_ACCESS);
		if (hSCManager == IntPtr.Zero)
		{
			dwErrorCode = Kernel32.GetLastError();
		}
		hService = IntPtr.Zero;
		hDevice = (IntPtr)Kernel32.INVALID_HANDLE_VALUE;
		dwErrorCode = 0;
	}
		
	private bool queryCurrentStatus(out uint dwCurrentState)
	{
		dwCurrentState = 0;
		if (hService != IntPtr.Zero)
		{
			Advapi32.SERVICE_STATUS serviceStatus = new Advapi32.SERVICE_STATUS();
			if (Advapi32.QueryServiceStatus(hService, ref serviceStatus) != 0)
			{
				dwCurrentState = serviceStatus.dwCurrentState;
				return true;
			}
			else
			{
				dwErrorCode = Kernel32.GetLastError();
			}
		}
		return false;
	}

	public uint getLastError()
	{
		return dwErrorCode;
	}

	public bool isOpened()
	{
		return !hService.Equals(IntPtr.Zero);
	}

	public bool open(string driverName)
	{
		if (hSCManager != IntPtr.Zero)
		{
			if (driverName == "")
			{
				return false;
			}
			if (hService != IntPtr.Zero)
			{
				Advapi32.CloseServiceHandle(hService);
			}
			hService = Advapi32.OpenService(hSCManager, driverName, Advapi32.SERVICE_ALL_ACCESS);
			if (hService != IntPtr.Zero)
			{
				return true;
			}
			else
			{
				dwErrorCode = Kernel32.GetLastError();
			}
		}
		return false;
	}

	public bool install(string driverName, string driverPath, string displayName)
	{
		if (hSCManager != IntPtr.Zero)
		{
			if (driverName == "" || driverPath == "" || displayName == "")
			{
				return false;
			}
			if (hService != IntPtr.Zero)
			{
				Advapi32.CloseServiceHandle(hService);
			}
			//CreateService(scHandle, szDrvSvcName, szDrvDisplayName, 
			//SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, 
			//SERVICE_ERROR_NORMAL, szDrvFilePath, 0, 0, 0, 0, 0)
			hService = Advapi32.CreateService(hSCManager, driverName, displayName, Advapi32.SERVICE_ALL_ACCESS,
				Advapi32.SERVICE_KERNEL_DRIVER, Advapi32.SERVICE_DEMAND_START, Advapi32.SERVICE_ERROR_NORMAL,
				driverPath, null, IntPtr.Zero, null, null, null);
			if (hService != IntPtr.Zero)
			{
				return true;
			}
			else
			{
				dwErrorCode = Kernel32.GetLastError();
			}
		}
		return false;
	}

	public bool start()
	{
		if (hService != IntPtr.Zero)
		{
			if (Advapi32.StartService(hService, 0, null) != 0)
			{
				uint dwCurrentState = 0;
				long nCount = 0;
				bool bRet = queryCurrentStatus(out dwCurrentState);
				while (nCount < 31 || (bRet && dwCurrentState != Advapi32.SERVICE_RUNNING))
				{
					Interlocked.Increment(ref nCount);
					bRet = queryCurrentStatus(out dwCurrentState);
					Thread.Sleep(31);
				}
				return true;
			}
			else
			{
				dwErrorCode = Kernel32.GetLastError();
			}
		}
		return false;
	}

	public bool stop()
	{
		unlink();
		if (hService != IntPtr.Zero)
		{
			Advapi32.SERVICE_STATUS serviceStatus = new Advapi32.SERVICE_STATUS();
			if (Advapi32.ControlService(hService, Advapi32.SERVICE_CONTROL_STOP, ref serviceStatus) != 0)
			{
				long nCount = 0;
				uint dwCurrentState;
				bool bRet = queryCurrentStatus(out dwCurrentState);
				while (nCount < 31 || (bRet && dwCurrentState != Advapi32.SERVICE_STOPPED))
				{
					Interlocked.Increment(ref nCount);
					bRet = queryCurrentStatus(out dwCurrentState);
					Thread.Sleep(31);
				}
				return true;
			}
			else
			{
				dwErrorCode = Kernel32.GetLastError();
			}
		}
		return false;
	}

	public bool uninstall()
	{
		if (hService != IntPtr.Zero)
		{
			stop();
			if (Advapi32.DeleteService(hService) != 0)
			{
				Advapi32.CloseServiceHandle(hService);
				hService = IntPtr.Zero;
				return true;
			}
			else
			{
				dwErrorCode = Kernel32.GetLastError();
			}
		}
		return false;
	}

	public bool link(string deviceLink)
	{
		if (hDevice == (IntPtr)Kernel32.INVALID_HANDLE_VALUE)
		{
			if (deviceLink == "")
			{
				return false;
			}
			if (!deviceLink.StartsWith("\\\\.\\"))
			{
				deviceLink = "\\\\.\\" + deviceLink;
			}
			hDevice = Kernel32.CreateFile(
				deviceLink, Kernel32.GENERIC_READ | Kernel32.GENERIC_WRITE, 0, IntPtr.Zero,
				Kernel32.OPEN_EXISTING, Kernel32.FILE_ATTRIBUTE_NORMAL, IntPtr.Zero);
			if (hDevice != (IntPtr)Kernel32.INVALID_HANDLE_VALUE)
			{
				return true;
			}
			else
			{
				dwErrorCode = Kernel32.GetLastError();
			}
		}
		return false;
	}

	public bool ioControl(uint dwIoCtlCode, byte[] pBufferIn, uint dwBufferIn, byte[] pBufferOut, uint dwBufferOut)
	{
		if (hDevice != (IntPtr)Kernel32.INVALID_HANDLE_VALUE)
		{
			uint bytesReturn = 0;
			int ioret = Kernel32.DeviceIoControl(hDevice, dwIoCtlCode,
				pBufferIn, dwBufferIn, pBufferOut, dwBufferOut,
				ref bytesReturn, IntPtr.Zero);
			if (ioret == 0)
			{
				dwErrorCode = Kernel32.GetLastError();
			}
			else
			{
				return true;
			}
		}
		return false;
	}

	public void unlink()
	{
		Kernel32.CloseHandle(hDevice);
		hDevice = (IntPtr)Kernel32.INVALID_HANDLE_VALUE;
	}

	public DriverControl()
	{
		initialize();
	}

	public DriverControl(string serviceName)
	{
		initialize();
		open(serviceName);
	}

	~DriverControl()
	{
		if (hDevice != (IntPtr)Kernel32.INVALID_HANDLE_VALUE)
		{
			Kernel32.CloseHandle(hDevice);
		}
		if (hService != IntPtr.Zero)
		{
			Advapi32.CloseServiceHandle(hService);
		}
		if (hSCManager != IntPtr.Zero)
		{
			Advapi32.CloseServiceHandle(hSCManager);
		}
	}
}


 

点云数据增强及预处理 数据增强: 1. random world flip:沿着x或者y轴,翻转点云 点云的x或者y,要翻转 3d box中心的x或者y,要翻转 3d box的朝向要翻转 point segmentation label,点云的相对顺序没有发生变化 2. random_world_rotation:沿着点云原点,旋转点云 点,x,y,绕z轴旋转 3d box,绕z轴旋转,中心和朝向都要变化 point segmentation label,点云的相对顺序没有发生变化 3. random_world_scaling 阅读详情

相关推荐

从IR Drop到EM分析:数字IC电源规划中那些没人明说的细节(以MTCMOS配置为例)

本文深入探讨数字IC后端设计中电源规划的关键细节,特别关注MTCMOS配置、电源网络电阻最小化和level shifter供电等实战技巧。通过分析IR Drop和EM问题,提供优化floorplan和powerplan的具体策略,帮助工程师避免常见陷阱,提升芯片设计的稳定性和可靠性。

q9w8e7r6t5的博客 511

【C#】分享基于Win32 API的服务操作类(解决ManagedInstallerClass.InstallHelper不能带参数安装的问题)...

【C#】分享基于Win32 API的服务操作类(解决ManagedInstallerClass.InstallHelper不能带参数安装的问题) 注:这里的服务是指Windows 服务。 ------------------201508250915更新------------------ 刚刚得知TransactedInstaller类是支...

weixin_30378623的博客 480

Arduino DHT11 ESP8266 在OneNet云平台上读取 温湿度

#include "ESP8266.h" #include "dht11.h" #include "SoftwareSerial.h" #define SSID "540ND" #define PASSWORD "" #define HOST_NAME "api.heclouds.com" #define DEVICE_ID "" #define HOST_PORT (80) String APIKey = " "; #define INTER

weixin_45852947的博客 2430

C#获取U盘序列号和盘符

private List<string> _serialNumber = new List<string>(); private void matchDriveLetterWithSerial() { string[] diskArray; string driveNumber; var searcher = new ManagementObjectSearcher("SELECT * FRO.

ilikehigame的专栏 2230

TOD和PPS精确时间同步技术

授时

u010783226的专栏 1万+

线性分类器(Linear Classifier)

线性分类器 如上图所示,这是二维空间中的一个数据集,如果他正好能够被一条直线分成两类,那么我们称它为线性可分数据集,这条直线就是一个线性分类器。 在三维空间中,如果数据集线性可分,是指能够被一个平面分为两类。 在一维空间中,所有的点都在一条直线上,如果线性可分。可以理解为它们能够被一个点分开。 这里的直线、平面、点被分为决策边界。 一个 m 维空间中的数据集,如果能够被一个超平面一分为二,那么这个数据集就是线性可分的,这个超平面就是决策边界。 例如,这是二维平面上的一条直线, 它可以把平面切分成两

xuechanba的博客 1万+

vb创建NT服务

'* ************************************************************** * '* 程序名称:modNtSrv '* 程序功能:实现NT服务 '* 作者:lyserver '* 联系方式:http://blog.youkuaiyun.com/lyserver '*...

weixin_30681615的博客 212

Ubuntu20.04下SRS流媒体服务器的安装与开机自启动优化指南

本文详细介绍了在Ubuntu20.04系统下安装SRS流媒体服务器并优化开机自启动的完整指南。从基础环境准备、服务管理方案对比到systemd自启动深度优化,提供了实用的配置技巧和排查方法,帮助用户快速搭建稳定的流媒体服务环境。特别推荐使用systemd方案实现高效的自启动管理。

weixin_29313239的博客 413

【原创】驱动枚举之QueryServiceStatus

BOOL WINAPI QueryServiceStatus( _In_ SC_HANDLE hService, _Out_ LPSERVICE_STATUS lpServiceStatus ); 函数作用:获取指定驱动的当前状态 参数: 1. hService:服务句柄, OpenService 或 CreateService 的返回值获得,需要用SERVICE_QUERY_...

weixin_34292959的博客 335

从零到一:如何用YOLOv8和PyQt5打造一个高效的路面坑洞检测系统

本文详细介绍了如何利用YOLOv8和PyQt5开发一个高效的路面坑洞检测系统。从环境配置、数据采集标注到模型训练优化,再到PyQt5界面开发与系统集成,提供了完整的实战指南。该系统结合深度学习技术,显著提升了道路检测的准确性和效率,适用于各类道路维护场景。

weixin_29047919的博客 308

华为OD机试真题 新系统 - 计算数列位置N的值 (Java/Py/C/C++/Js/Go)

本文整理华为 OD 机试新系统机考真题库,涵盖高频考点精析与完整题目内容,提供 C 语言、Java、C++、Python、Go、JavaScript 多语言源码实现,搭配详细解题思路讲解,并支持在线 OJ 刷题练习,助力高效备考华为 OD 机试新系统。

算法大师! 2009

QueryServiceStatus

QueryServiceStatusThe QueryServiceStatus function retrieves the current status of the specified service.This function has been superseded by the QueryServiceStatusEx function. QueryServiceStatusEx ret

小发猫 2009

OpenHarmony深度定制:从系统到模块的全景剖析与自定义模块实战

目标:在中新增一个算法库,让产品可直接调用。关闭不用的 20+ 系统部件,ROM 缩小 50 %;为自家芯片新增专用驱动模块,快速点亮开发板;内将核心算法库以部件形式集成,实现商业闭源。万物互联时代,差异化才是护城河。

m0_67505153的博客 1036

QueryServiceStatus、SetServiceStatus:获取设置服务运行状态

QueryServiceStatus: 获取服务运行状态,函数原型如下: BOOL QueryServiceStatus( SC_HANDLE hService, LPSERVICE_STATUS lpServiceStatus); 参数hService是服务句柄,lpServiceStatus指向保存服务状态信息的SERVICE_STATUS机构的变量,返回表示是否成功。 Set

Armstronghappy的专栏 2236

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

windows 任务管理器 API 调用

1.窗口信息     MS为我们提供了打开特定桌面和枚举桌面窗口的函数。     hDesk=OpenDesktop(lpszDesktop,0,FALSE,DESKTOP_ENUMERATE);     //打开我们默认的Default桌面;     EnumDesktopWindows(hDesk,(WNDENUMPROC)EnumWindowProc,0);     //枚举打开桌

zhuyaojun的专栏 3601

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

INVALID_HANDLE_VALUE 与 NULL

[cpp] view plaincopyprint? #include "stdafx.h"   #include    #include          using namespace std;         int _tmain(int argc, _TCHAR* argv[])   {       HANDLE m_hCom = Crea

koln频道 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Driver接口和DriverManager类

一、Driver接口 它是所有JDBC驱动程序必须实现的接口,此接口专门提供给数据库厂商使用,但在编写JDBC程序时,必须得把所用到的数据库驱动程序或类库加载到项目的classpath(jar包)中。 二、DriverManager类 此类是用于加载JDBC驱动并创建与数据库的连接,在DriverManager类中,有两个较重要的静态方法,static synchronized void registerDriver(Driver driver)和static Connection getConnec

J57351的博客 2561

判断服务状态启动停止

static void RestartHostServer() { // 打开服务管理对象 SC_HANDLE hSC = ::OpenSCManager( NULL, NULL, GENERIC_EXECUTE); if( hSC == NULL) { return; } // 打开ProxyServer服务。 SC_HANDLE h...

weixin_30892889的博客 627

设置程序在Windows开机后自动运行的方式

设置程序开机自动运行的方式主要有三种: 一、把快捷方式复制到[开始->所有程序->启动]中。这个得依赖用户的操作。 二、程序添加到Windows开机选项中启动运行。 把程序启动路径写进注册表中,如把程序“C:\a.exe”存放到下列注册表项中: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run或 H...

weixin_33911824的博客 3270

Windows API Reference for C#, VB.NET and VB6

Windows API Reference for C#, VB.NET and VB6The Windows API (application programming interface) are the low level workings of Windows. It offers high performance, and lightweight code, but it is ver

greystar的专栏 5292

INVALID_HANDLE_VALUE的意思和用法

assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行。 ASSERT(IsOpen()); 但 IsOpen()定义为 BOOL IsOpen() const { return m_hComm != INVALID_HANDLE_VALUE; };//INVALID_HANDLE_VALUE若前面得到了一个句柄,则应关闭掉 INVALID_H...

物联网小镇的博客 8087

JDBC基础教程之驱动设置

[正文]  1、概述   DriverManager 类是 JDBC 的管理层,作用于用户和驱动程序之间。它跟踪可用的驱动程序,并在数据库和相应驱动程序之间建立连接。另外,DriverManager 类也处理诸如驱动程序登录时间限制及登录和跟踪消息的显示等事务。   对于简单的应用程序,一般程序员需

1106

JDBC系列教程(二)---驱动设置

DriverManager 本概述摘自《JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference》,目前正由 JavaSoft 继续编写。这本书既是 JDBC 的教程,也是一本权威性参考手册,将作为 Java 系列的一部分在 1997 年春季由 Addison-Wesley 出版公司出版。 3.1 概述 Drive

键者天行 6836

.NET获取硬盘序列号的几个方法

最近作软件注册,收集了很多.NET相关的获取硬盘物理序列号的方法,主要分为使用WMI方式和API方式。但这些方法均可能有问题。1,使用WMI方式,有的机器根本取不到硬盘序列号,有的方式在Vista下面会报错。常用的使用WMI的方式主要有下面一些方式:class HardDrive    {        private string model = null;   

深蓝的智慧,医生的严谨 1万+
上一篇: 多CPU下安全inline hook
下一篇: 还原NtTerminateProcess
vizee
博客等级 码龄16年 3粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值