当前位置: 首页 > news >正文

windows内核编程-文件操作

文章目录

    • 前言
    • 背景知识点介绍
      • 字符串
      • 内存分配与回收
      • 文件操作
      • 自旋锁
    • win内核编程-日志实现
      • 文件操作的封装
      • 日志功能的实现
      • 简单的测试日志功能
    • 其他

前言

本文完整代码见:demo/12-win-driver-log

我们必须先搞定,DebugView可以看到DbgPrintDbgPrint的输出。否则,代码没法写。因为,大概率代码不会一次通过,需要结合输出信息进行修改。而这些准备工作见:windows驱动开发环境搭建以及helloworld_大1234草的博客-CSDN博客_驱动环境搭建

在用户层编程,通常使用日志记录程序运行情况。我们把这个习惯延续到内核编程中来。

我上网上找了一圈,似乎没有很好的win内核编程日志框架,所以这里简单实现一个。这里假定我们已经知道用户层如何使用日志:spdlog日志库的封装使用_大1234草的博客-CSDN博客_spdlog 封装

对这个内核日志的实现有如下要求:

  • 每次打开日志文件的时候覆盖之前的日志。(为了避免日志文件大小一直增加。也避免日志文件循环这样有些复杂的实现。毕竟主要是调试的时候使用)

  • 可以控制,在debug版本的时候显示日志,在release版本的时候,日志函数为空。

  • 不提供日志等级。(日志等级的实现毫无难度,只是目前没有必要)

  • 提供线程安全,和线程不安全两种日志记录函数。


背景知识点介绍

参考:《Windows内核安全与驱动开发》第二章 内核编程环境及其特殊性、第三章 字符串与链表、第四章 文件、注册表、线程

书上的内容翻下就好,不需要细看。初级编程,了解有哪些数据结构+API就好。

至于windows官方文档,它比较零碎,查某个具体的API可以,但是并没有将这些API串起来介绍。


字符串

参考:_UNICODE_STRING (ntdef.h) - Win32 apps | Microsoft Learn、Windows 内核驱动字符串操作 – My Code

使用UNICODE_STRING结构用于定义 Unicode 字符串。它的数据结构如下所示:

typedef struct _UNICODE_STRING {USHORT Length;USHORT MaximumLength;PWSTR  Buffer;
} UNICODE_STRING, *PUNICODE_STRING;

该数据结构相关的操作函数:

  • 初始化函数:RtlInitUnicodeString

  • 拷贝函数:RtlCopyUnicodeString

  • Append 字符串:RtlAppendUnicodeToString

字符串相关:Windows 内核模式安全字符串库 - Windows drivers | Microsoft Learn


内存分配与回收

参考:Windows内核编程基础之内存的分配与释放_PandaMohist的博客-CSDN博客

分配内存:exAllocatePool函数已经过时, 它已被 ExAllocatePool2 取代。

释放内存:ExFreePool


文件操作

参考:在驱动程序中使用文件 - Windows drivers | Microsoft Learn、Windows内核驱动中操作文件 (转) - 心如止水-杜 - 博客园、Windows内核编程之:文件操作 - qintangtao - 博客园

建议去翻下书,系统的了解下这套API的使用。这里不赘述。


自旋锁

锁可以解决线程同步问题。这里选用自旋锁(其他锁没用过,也不知道)

参考:使用驱动程序提供的自旋锁 - Windows drivers | Microsoft Learn


win内核编程-日志实现

文件操作的封装

windows的函数参数多的令人脑子疼。

原有的API比较细粒度,控制更准确,但是调用起来会麻烦点。所以,习惯上会简单的封装下。

#pragma once/* modified from : aurain, https://www.cnblogs.com/dhf327/p/4793674.html  */#include <ntddk.h>/**/
/** * 创建或打开文件
* @param lpFileHandle 返回打开的文件句柄指针
* @param usFileName 需要打开的文件路径,使用对象路径,如\\??\\c:\test.txt
* @param dwDesiredAccess 申请权限,可以用|(或)组合以下操作写文件内容-FILE_WRITE_DATA,设置文件属性-FILE_WRITE_ATTRIBUTES,通用写-GENERIC_WRITE 读文件内容-FILE_READ_DATA,设置文件属性-FILE_READE_ATTRIBUTES,通用写-GENERIC_READ 删除文件-DELETE 全部权限-GENERIC_ALL 同步打开文件-SYNCHRONIZE
* @param dwShareAccess 共享方式(是指本代码打开这个文件时,允许别的代码同时打开这个文件所具有的权限 可以用|(或)组合以下操作共享读-FILE_SHARE_READ共享写-FILE_SHARE_WRITE共享删除-FILE_SHARE_DELETE
* @param dwCreateDisposition 创建或打开文件的目的新建文件-FILE_CREATE打开文件-FILE_OPEN打开或新建-FILE_OPEN_IF覆盖-FILE_OVERWRITE新建或覆盖-FILE_OVERWRITE_IF新建或取代-FILE_SUPERSEDE
* @param dwCreateOptions 打开文件时选项设置 一般用FILE_NOT_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT* @return 读取成功: STATUS_SUCCESS;读取失败:NTSTATUS error code */__inline NTSTATUS CreateFile(OUT PHANDLE lpFileHandle,IN PUNICODE_STRING usFileName,IN ULONG dwDesiredAccess,IN ULONG dwShareAccess,IN ULONG dwCreateDisposition,IN ULONG dwCreateOptions) {NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;OBJECT_ATTRIBUTES oaName;IO_STATUS_BLOCK iosBlock;if (lpFileHandle != NULL && usFileName != NULL && usFileName->Buffer != NULL) {InitializeObjectAttributes(&oaName, usFileName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);ntStatus = ZwCreateFile(lpFileHandle, dwDesiredAccess, &oaName, &iosBlock, NULL, FILE_ATTRIBUTE_NORMAL, dwShareAccess, dwCreateDisposition, dwCreateOptions, NULL, 0);}return ntStatus;
}/**/
/** * 关闭打开的文件句柄
* @param hFile 文件句柄
* @return 读取成功: STATUS_SUCCESS;读取失败:NTSTATUS error code
*/__inline NTSTATUS CloseFile(IN HANDLE hFile) {return ZwClose(hFile);
}/**//** * 读取文件内容
* @param hFile 文件句柄
* @param pBuffer 缓冲区
* @param ulBufferSize 缓冲区大小
* @param byteOffset 偏移量
* @param pulBytesRead 实际读取的大小
* @return 读取成功: STATUS_SUCCESS;读取失败:NTSTATUS error code
*/__inline NTSTATUS ReadFile(IN HANDLE hFile, IN PVOID pBuffer, IN ULONG ulBufferSize, IN PLARGE_INTEGER byteOffset, OUT PULONG pulBytesRead) {IO_STATUS_BLOCK  iosBlock; NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;if (hFile == NULL || pBuffer == NULL) {return ntStatus;}*pulBytesRead = 0;ntStatus = ZwReadFile(hFile, NULL, NULL, NULL, &iosBlock, pBuffer, ulBufferSize, byteOffset, NULL);if (NT_SUCCESS(ntStatus)) {//获取实际读取到的大小*pulBytesRead = (ULONG)iosBlock.Information;}return ntStatus;
}/**/
/** * 向文件写入内容
* @param hFile 文件句柄
* @param pBuffer 缓冲区
* @param ulBufferSize 缓冲区大小
* @param byteOffset 偏移量
* @return 读取成功: STATUS_SUCCESS;读取失败:NTSTATUS error code
*/
__inline NTSTATUS WriteFile(IN HANDLE hFile, IN PVOID pBuffer, IN ULONG ulBufferSize, IN PLARGE_INTEGER byteOffset, OUT PULONG pulBytesWrite) {IO_STATUS_BLOCK iosBlock; NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;if (hFile == NULL || pBuffer == NULL) {return ntStatus;}DbgPrint("before zwwritefile.");*pulBytesWrite = 0;ntStatus = ZwWriteFile(hFile, NULL, NULL, NULL, &iosBlock, pBuffer, ulBufferSize, byteOffset, NULL);if (NT_SUCCESS(ntStatus)) {*pulBytesWrite = (ULONG)iosBlock.Information;}return ntStatus;
}

日志功能的实现

上面封装的很浅。调用上面的接口,以将日志信息写入文件。

头文件的定义。

#pragma once#include "file_help.h"
#include <wdm.h>
#include <ntstrsafe.h>#define BUFF_SIZE 256int log_init(wchar_t* plog_file);int log_exit();int write_log(char* format, va_list arg, BOOLEAN thread_safe);void log_debug(char* format, ...);void log_debug_safe(char* format, ...);#if DBG 
#define kd_log_debug(_x_) log_debug _x_
#define kd_log_debug_safe(_x_) log_debug_safe _x_
#else
#define kd_log_debug(_x_)
#define kd_log_debug_safe(_x_)
#endif

头文件的实现。

#include "log.h"HANDLE log_file_handle = NULL;
KSPIN_LOCK spin_lock;int log_init(wchar_t* plog_file)
{// 初始化自旋锁KeInitializeSpinLock(&spin_lock);UNICODE_STRING unicode_log_file;RtlInitUnicodeString(&unicode_log_file, plog_file);// 具有读写权限,写追加。允许其他线程读取。每次打开进行覆盖,没有的话则创建。文件不是一个目录文件。// NTSTATUS ntStatus = CreateFile(log_file_handle, &unicode_log_file, FILE_READ_DATA | FILE_APPEND_DATA, FILE_SHARE_READ, FILE_OVERWRITE_IF, FILE_NON_DIRECTORY_FILE);// 注意最后一个参数。如果只设置成FILE_NON_DIRECTORY_FILE,而不设置FILE_SYNCHRONOUS_IO_NONALERT,在zwWritefile的时候,会返回STATUS_INVALID_PARAMETERNTSTATUS ntStatus = CreateFile(&log_file_handle, &unicode_log_file, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_VALID_FLAGS, FILE_OVERWRITE_IF, FILE_SYNCHRONOUS_IO_NONALERT);DbgPrint("create log file status: %x", ntStatus);return 0;
}int log_exit()
{if (log_file_handle != NULL) {CloseFile(log_file_handle);}return 0;
}int write_log(char* format, va_list arg, BOOLEAN thread_safe)
{NTSTRSAFE_PSTR buffer = NULL; //buffer = ExAllocatePool2(POOL_FLAG_NON_PAGED, BUFF_SIZE, 'LOGM');if (buffer == NULL) {return -1;}RtlStringCbVPrintfA(buffer, BUFF_SIZE, format, arg);RtlStringCbCatA(buffer, BUFF_SIZE, "\r\n");size_t in_len;RtlStringCbLengthA(buffer, BUFF_SIZE, &in_len);ULONG write_len = 0;// DbgPrint("log write: %s", buffer);// DbgPrint("log size: %lld", in_len);KIRQL irql;if (thread_safe == TRUE) {KeAcquireSpinLock(&spin_lock, &irql);}NTSTATUS ntStatus = WriteFile(log_file_handle, buffer, in_len, NULL, &write_len);// DbgPrint("log write in: %ld", write_len);if (thread_safe == TRUE) {KeReleaseSpinLock(&spin_lock, irql);}DbgPrint("write log file status: %x", ntStatus);ExFreePool(buffer);return 0;
}void log_debug(char* format, ...) {va_list va;va_start(va, format);write_log(format, va, FALSE);va_end(va);
}void log_debug_safe(char* format, ...) {va_list va;va_start(va, format);write_log(format, va, TRUE);va_end(va);
}

简单的测试日志功能

#include "log.h"
#include<ntddk.h>VOID DriverUnload(PDRIVER_OBJECT driver)
{log_debug("test: Our driver is unloading.");log_exit();
}NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{wchar_t log_path[] = L"\\??\\C:\\test.txt";log_init(log_path);kd_log_debug(("kd_log_debug, enter in test driver: %wZ", reg_path));kd_log_debug_safe(("kd_log_debug_safe, enter in test driver: %wZ", reg_path));log_debug("log_debug, enter in test driver: %wZ", reg_path);log_debug_safe("log_debug_safe, enter in test driver: %wZ", reg_path);driver->DriverUnload = DriverUnload;return STATUS_SUCCESS;
}

其他

  • 闲聊Windows系统日志 - FreeBuf网络安全行业门户

  • windows 7 - What is the difference between ProgramData and AppData? - Stack Overflow

  • EditorConfig 设置 - Visual Studio (Windows) | Microsoft Learn

相关文章:

交错字符串

https://leetcode.cn/problems/interleaving-string/description/?envType=study-plan-v2&envId=top-interview-150 以下是通过动态规划解决该问题的正确方法。首先,如果字符串 s1 和 s2 的长度之和不等于字符串 s3 的长度,即 |s1| + |s2| ≠ |s3|,那么字符串 s3 不可能…...

基于Springboot+Vue的Java项目-火车票订票系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…...

Ftrans文件外发系统 构建安全可控文件外发流程

文件外发系统是企业数据安全管理中的关键组成部分,它主要用于处理企业内部文件向外部传输的流程,确保数据在合法、安全、可控的前提下进行外发。 文件外发系统的主要作用包括: 1、防止数据泄露:通过严格的审批流程和安全策略,防止未经授权的文件外发,从而降低数据泄露风…...

基于PWM控制的三相整流器simulink仿真

整理了基于PWM控制的三相整流器simulink仿真模型&#xff0c;附赠报告&#xff0c;效果明显。 三相全桥PWM整流器,通过对电路进行SPWM控制,使得整流桥的交流输出端产生正弦PWM电压,对各相电压进行控制,就可以使各相电流为正弦波且和电压相位相同,从而使功率囚数为1。当电路工作…...

30V-STM32设计项目

30V-STM32设计 一、项目描述 (已验证) 基于STM32c8t6芯片设计的开发板&#xff0c;支持4-30V宽电压输入&#xff0c;串口模式自动下载功能&#xff0c;支持串口和STlink&#xff0c;方式下载程序 二、原理图介绍 电源电路采用了DCDCLDO电路&#xff0c;如果是外接DC头供电的话&…...

Java中的模版方法设计模式详解

Java中的模版方法设计模式详解 在Java编程中&#xff0c;设计模式是一种解决常见问题的最佳实践。其中&#xff0c;模版方法设计模式是一种行为设计模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;而将一些步骤延迟到子类中。这样可以使子类在不改变算法结构的情况…...

windows内核编程-文件操作

文章目录前言背景知识点介绍字符串内存分配与回收文件操作自旋锁win内核编程-日志实现文件操作的封装日志功能的实现简单的测试日志功能其他前言 本文完整代码见&#xff1a;demo/12-win-driver-log 我们必须先搞定&#xff0c;DebugView可以看到DbgPrintDbgPrint的输出。否则…...

Hadoop原理与技术——Linus命令行基本操作

点击链接查看文档 一、实验目的 Hadoop运行在Linux系统上&#xff0c;因此&#xff0c;需要学习实践一些常用的Linux命令。本实验旨在熟悉常用的Linux操作&#xff0c;为顺利开展后续其他实验奠定基础。 二、实验环境 Windows 10 VMware Workstation Pro虚拟机 Hadoop环境 J…...

目标检测算法——YOLOv5/YOLOv7改进之结合特征提取网络RFBNet(涨点明显)

>>>深度学习Tricks,第一时间送达<<< 🚀🚀🚀NEW!!!魔改YOLOv5/v7目标检测算法来啦 ~ 计算机视觉——致力于目标检测领域科研Tricks改进与推荐 | 主要包括Backbone、Neck、Head、普通注意力机制、自注意力机制Transformer、Swin Transformer v2,各…...

anaconda使用系列教程--4)环境迁移

概述 跨平台尽量避免&#xff0c;比如windows和linux就不要跨平台&#xff0c;就在linux之间跨还是可以的 直接copy整体环境文件&#xff0c;适合于无法联网或网速不佳的新环境 anaconda最好是同版本的 迁移方法 使用requirement文件 A机器&#xff1a; pip freeze > …...

Kotlin高仿微信-第57篇-VIP管理列表

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…...

贪心算法-- 纪念品分组

问题描述元旦快到了&#xff0c;校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值 相对均衡&#xff0c;他要把购来的纪念品根据价格进行分组&#xff0c;但每组最多只能包括两件纪念品&#xff0c;并且每组纪念品的价格之和不能超过一个给…...

java-php-net-python-代驾网站计算机毕业设计程序

java-php-net-python-代驾网站计算机毕业设计程序 java-php-net-python-代驾网站计算机毕业设计程序本源码技术栈&#xff1a; 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 开发软件&#xff1a;idea eclipse 前端技术&#xff1a;Layui、HTML、CSS、JS、JQ…...

简洁自增ID实现方案

简介 从数据库性能角度考虑&#xff0c;我们经常需要数字型的自增主键&#xff0c;有时候我们并不想用像MySQL自带的自增&#xff0c;因为从1开始很数据位数不一样&#xff0c;对有点强迫症的人来说&#xff0c;不是很友好。 另外&#xff0c;别人也容易根据这种从1开始的自增…...

JMeter入门教程(14)——场景设计

1.JMeter中场景设计是通过线程组来实现的 如图&#xff1a; 控制面板中各元素介绍&#xff1a; 名称&#xff1a;可以随意设置&#xff0c;最好有业务意义。 注释&#xff1a;可以随意设置&#xff0c;可以为空。 在取样器错误后要执行的动作&#xff1a;其中的某一个请求出错后…...

SVM 用于将数据分类为两分类或多分类(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…...

转行软件测试我后悔了

很多时候&#xff0c;都在想当初做的转行软件测试行业的决定是对的吗&#xff1f;现在后悔还来得及吗&#xff1f; 记得在求职的时候&#xff0c;面试官经常问我&#xff1a;“为什么要选择软件测试工作?” 而我也会经常说一堆自己有的没的优势去应付。 工作这么久了&#x…...

k8s教程(15)-pod之亲和性与互斥性调度

文章目录01 引言02 pod亲和性调度与互斥性调度2.1 拓扑域2.2 举例2.2.1 参照目标pod2.2.2 pod的亲和性调度2.2.3 pod的互斥性调度03 其它04 文末01 引言 声明&#xff1a;本文为《Kubernetes权威指南&#xff1a;从Docker到Kubernetes实践全接触&#xff08;第5版&#xff09;》…...

浅谈降维实操,一种用于处理特征的方式——后附Python代码

&#x1f466;&#x1f466;一个帅气的boy&#xff0c;你可以叫我Love And Program &#x1f5b1; ⌨个人主页&#xff1a;Love And Program的个人主页 &#x1f496;&#x1f496;如果对你有帮助的话希望三连&#x1f4a8;&#x1f4a8;支持一下博主 降维实操前言线性降维低…...

深度学习中的正则化——L1、L2 和 Dropout

正则化是一组技术&#xff0c;可以防止神经网络中的过度拟合&#xff0c;从而在面对来自问题域的全新数据时提高深度学习模型的准确性。 在本文中&#xff0c;我们将介绍最流行的正则化技术&#xff0c;称为 L1、L2 和 dropout。 文章目录1. 回顾&#xff1a;过拟合2.什么是正则…...

数据结构(王卓)(4)附:链表的销毁与清空

销毁 Status 销毁单链表(LinkList L) {LinkList p;while (L){p L;L->next;delete p;}return OK; } 运行逻辑&#xff1a; &#xff08;1&#xff09;:设定一个指针&#xff0c;让指针指向链表的头指针L &#xff08;2&#xff09;&#xff1a;让头指针等于头指针里面指向下…...

C++图书管理系统(管理员-读者)

C图书管理系统&#xff08;管理员-读者&#xff09; 一、设计一款文字式交互的图书管理系统&#xff0c;要求具备注册登录、浏览图书、借还图书等基本功能&#xff1b; 二、要求以外部文件的形式存储书籍信息、馆藏记录、借阅记录、用户信息等。【可参考提供的书籍清单】 三…...

永磁同步电机恒压频比(V/F)开环控制系统Matlab/Simulink仿真分析及代码生成到工程实现

文章目录前言一、 恒压频比&#xff08;V/F&#xff09;控制原理二、永磁同步电机恒压频比开环控制系统Matlab/Simulink仿真分析2.1.仿真电路分析2.1.1.恒压频比控制算法2.1.2.输出处理2.1.3.主电路2.2.仿真结果分析2.2.1.设定目标转速为1200r/min2.2.1.设定目标转速为变化值三…...

基于JSP网上书城的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…...

java计算机毕业设计-学生宿舍故障报修管理信息系统-源程序+mysql+系统+lw文档+远程调试

java计算机毕业设计-学生宿舍故障报修管理信息系统-源程序mysql系统lw文档远程调试 java计算机毕业设计-学生宿舍故障报修管理信息系统-源程序mysql系统lw文档远程调试本源码技术栈&#xff1a; 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 开发软件&#xf…...

vue学习笔记——简单入门总结(四)

文章目录1.Vue3的特性和变化1.1.创建vue3项目1.2.分析main.js变化&#xff1a;1.3.setup--组合式api的开端1.4.ref函数和reactive函数&#xff1a;1.5.watch监视属性1.5.watchEffect函数1.6.vue3生命周期&#xff1a;1.Vue3的特性和变化 1.1.创建vue3项目 1.这里我们使用脚手架…...

数据结构与算法—数组栈和链表栈

数据结构与算法—数组栈和链表栈 &#x1f308;一览众山小数据结构与算法—数组栈和链表栈栈介绍栈图解栈实现数组实现栈实现思路实现代码单链表实现栈实现思路(图解)实现代码栈总结栈力扣栈介绍 栈,存储货物或供旅客住宿的地方,可引申为仓库、中转站&#xff0c;所以引入到计算…...

【应用】Kubernetes

Kubernetesk8s 安装流程安装前配置安装 docker 以及 k8s 组件初始化 k8s 集群测试使用&#xff1a;安装 kubernetes-dashboardk8s 基础概念k8s 核心技术概念k8s 内部组件k8s 中的 IP 地址K8S 服务暴露的三种方式k8s 安装流程 k8s-masterk8s-node01k8s-node02192.168.86.140192…...

GEE:关系、条件和布尔运算

ee.Image对象具有一组用于构建决策表达式的关系、条件和布尔运算方法。这些方法可以用来掩膜、绘制分类地图和重新赋值。 本文记录了在GEE&#xff08;Google Earth Engine&#xff09;平台上的关系运算符和布尔运算符&#xff0c;分别应用到了三个不用的场景&#xff08;筛选低…...

Java项目:SSM的KTV管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 主要功能包括&#xff1a; 登陆页,房间信息,房间管理,开取房间,房间查询,会员管理,食物管理,查看订单,查询订单,查看房间消费使用情况等功能。…...

包装类-Wrapper

包装类的分类 针对八种基本数据类型相应的引用类型-包装类有了类的特点&#xff0c;就可以调用对应的类中的方法 装箱和拆箱 Java是一种面向对象的编程语言&#xff0c;学习Java时就被明确灌输了一个概念&#xff1a;OOP&#xff0c;即面向对象编程。一切皆对象。但是基本…...

计算机网络——运输层【重点】

运输层概述 概念 进程之间的通信 从通信和信息处理的角度看&#xff0c;运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时&…...

ADSP-21569/ADSP-21593的开发入门(上)

作者的话 ADI的SHARC系列DSP&#xff0c;目前已经出到5系列了&#xff0c;最新的一颗叫2159x&#xff0c;按照ADI的说法&#xff0c;这颗DSP的性能是21569的两倍&#xff0c;但又能和21569做P2P的替换&#xff0c;所以下面我们就以21593为例&#xff0c;写一点资料&#xff0c…...

【Android App】在线直播之搭建WebRTC的服务端(图文解释 简单易懂)

有问题或需要源码请点赞关注收藏后评论区留言私信~~~ 一、WebRTC的系统架构 WebRTC&#xff08;网页即时通信&#xff09;是一个支持浏览器之间实时音视频对话的新型技术&#xff0c;WebRTC体系由应用于实时通信的编程接口和一组通信协议组成&#xff0c;已成为互联网流媒体通…...

x265 帧间预测

帧间编码入口函数&#xff1a; 从 Analysis::compressCTU 是ctu编码的入口函数&#xff0c;根据 slice 类型判断是 I 还是 BP&#xff0c;如果是BP则执行帧间编码函数 Analysis::compressInterCU_rdx_x&#xff1a;&#xff1a;/*压缩分析CTU过程&#xff1a;1.为当前CTU加载QP…...

【sciter】安全应用列表控件总结

一、效果图 二、功能点 实现电脑文件拖拽进入到安全桌面,读取文件路径,生成应用。可以配置允许拖拽进入安全桌面的文件应用。点击添加图标,可以添加应用到安全桌面中。在安全桌面列表中每一个应用实现双击、失去焦点,获取焦点、右键事件在安全桌面列表中每一个应用可以实现…...

一篇文章让你搞懂Java顺序表

目录 一、 线性表的基本介绍 二、顺序表 1、顺序表的概念 2. 创建顺序表类&#xff08;ArrayList&#xff09; 2. 增加元素 3. 删除元素 4. 修改某个元素 5. 查找元素 Main类 在数据结构体系中我们将整个数据结构分为两类&#xff0c;一类是线性结构&#xff1b; 线性…...

小白必知必会的几个IP协议知识

小白必知必会的几个IP协议知识1.IP地址属于网络层协议2.路由控制3.数据链路的抽象化4.IP属于面向无连接型1.IP地址属于网络层协议 在计算机通信中&#xff0c;为了识别通信对端&#xff0c;必须要有一个类似于地址的识别码进行标识。 MAC地址是用来标识同一个链路中不同计算机…...

【45-线程的实现方式-线程池的创建方式-线程池的执行顺序-CompletableFutrue异步处理】

一.知识回顾 【0.三高商城系统的专题专栏都帮你整理好了&#xff0c;请点击这里&#xff01;】 【1-系统架构演进过程】 【2-微服务系统架构需求】 【3-高性能、高并发、高可用的三高商城系统项目介绍】 【4-Linux云服务器上安装Docker】 【5-Docker安装部署MySQL和Redis服务】…...

前馈神经网络与支持向量机实战 --- 手写数字识别

前馈神经网络与支持向量机实战 — 手写数字识别 文章目录前馈神经网络与支持向量机实战 --- 手写数字识别一、前馈神经网络介绍二、支持向量机介绍三、数据集说明四、环境准备五、实验要求六、Python代码tutorial_minst_fnn-keras.py&#xff1a;使用TensorFlow的Sequential实现…...

idea导入eclipse项目的时候,Java图标变成黄色小J了,怎么解决?

凯哥今天导入一个15年时候写的小项目&#xff0c;当时使用的是eclipse写的。最近好几年都在使用idea&#xff0c;习惯了idea的&#xff0c;在用eclipse&#xff0c;不习惯&#xff0c;不顺手&#xff0c;就导入到idea中。发现&#xff0c;Java文件的图标变成了黄色的J。如下图&…...

Redis配置与优化

1 关系数据库与非关系型数据库概述 1.1 关系型数据库 一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上 一般面向于记录 SQL 语句&#xff08;标准数据查询语言&#xff09;就是一种基于关系型数据库的语言 用于执行对关系型数据库中…...

管理团队相关的梳理

管理团队是跟踪团队成员工作表现,提供反馈,解决问题并管理团队变更,以优化项目绩效的过程。本过程的主要作用是,影响团队行为、管理冲突以及解决问题等方式,实现团队管理。 输入 1.项目管理计划 --------资源管理计划 2. 项目文件 --------问题日志、经验教训登记册、项…...

HTML5期末大作业【红色的电影售票平台网站】web前端 html+css+javascript网页设计实例 企业网站制作

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…...

【三维目标检测】Part-A2(一)

Part-A2是商汤在CVPR 2020上发布的三维点云目标检测模型&#xff0c;来源于PointRCNN同一作者&#xff0c;论文名称《From Points to Parts 3D Object Detection from Point Cloud with Part-aware and Part-aggregation Network》。从名称可以看出&#xff0c;Part代表的是目标…...

C++输出四舍五入的一些小问题

嗯…今天刚去练了一会简单题 就我大一刚上学做的那种题&#xff0c;嗯&#xff0c;然后我发现我还是得调试&#xff0c;想骂人了&#xff0c;就啥样的题呢, 嗯,就这样的题&#xff0c;虽然我大一可能也过不了这种题&#xff0c;hh 现在题目里面要求一些四舍五入的问题 刚才没整…...

详解设计模式:责任链模式

责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;也被称为职责链模式&#xff0c;是在 GoF 23 种设计模式中定义了的行为型模式。 责任链模式 是将链中的每一个节点看作是一个对象&#xff0c;每个节点处理的请求不同&#xff0c;且内部自动维护一个下一节点…...

Python源码剖析笔记1-整数对象PyIntObject

1、PyIntObject 对象 [intobject.h] typedef struct {PyObject_HEADlong ob_ival; } PyIntObjectPyIntObject是一个不可变&#xff08;immutable&#xff09;对象。Python内部也大量的使用整数对象&#xff0c;我们在自己的代码中也会有大量的创建销毁整型对象的操作&#xff…...

求一个网页设计作业——个人博客(HTML+CSS)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…...

HTML5期末大作业:基于html+css+javascript+jquery实现藏族文化15页【学生网页设计作业源码】

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…...

2. IMU原理及姿态融合算法详解

文章目录2. IMU原理及姿态融合算法详解一、组合二、 原理a) 陀螺仪b) 加速度计c) 磁力计三、 旋转的表达a) 欧拉角b) 旋转矩阵c) 四元数d) 李群 SO(3)\text{SO}(3)SO(3) 及 李代数 so(3)\text{so}(3)so(3)四、 传感器的噪声及去除a) 陀螺仪b) 加速度计c) 磁力计五、姿态解算原理…...

【能效管理】安科瑞远程预付费系统在江西某沃尔玛收费管理的应用

摘要&#xff1a;文章根据用电远程管控原理&#xff0c;设计了用电预付费远程管理终端及管理系统&#xff0c;该系统以智能远程预付费电表、智能网关以及预付费管理软件实现了商业综合体的用电管理&#xff0c;实现了欠费自动分闸&#xff0c;充值后自动合闸&#xff0c;并辅助…...

HTML+CSS+JS做一个好看的个人网页—web网页设计作业

个人网页设计个人网页&#xff08;htmlcssjs&#xff09;——网页设计作业带背景音乐&#xff08;The way I still Love you&#xff09;、樱花飘落效果、粒子飘落效果页面美观&#xff0c;样式精美涉及&#xff08;htmlcssjs&#xff09;&#xff0c;下载后可以根据自己需求进…...

【MySQL】表的增删改查(一)

你可以了解世间万物&#xff0c;但追根溯源的唯一途径便是亲身尝试。——《心灵捕手》 前言&#xff1a; 大家好&#xff0c;我是拳击哥&#xff0c;今天给大家讲解的是mysql表GRUD操作中的新增数据、查询数据以及表中数据的排序、去重等。因篇幅过长&#xff0c;分为两期来讲解…...

HTML5期末考核大作业、HTML个人主页界面设计源码

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…...

计算机毕业设计Java酒店信息管理(源码+系统+mysql数据库+lw文档)

计算机毕业设计Java酒店信息管理(源码系统mysql数据库lw文档) 计算机毕业设计Java酒店信息管理(源码系统mysql数据库lw文档)本源码技术栈&#xff1a; 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 开发软件&#xff1a;idea eclipse 前端技术&#xff1a;La…...

Qt使用OPCUA

假如想在Qt下使用OPCUA通讯&#xff0c;貌似大家都是倾向于使用【qtopcua】这个库。但是在Qt6之前&#xff0c;假如想使用这个库&#xff0c;还得自己编译&#xff0c;比较繁琐。假如想开箱即用&#xff0c;而且没有使用太复杂的功能的话&#xff0c;其实可以直接使用open62541…...

【win10相关】更新后出现未连接到互联网的问题及解决

问题背景 在win10更新完系统之后&#xff0c;第二天电脑开机后&#xff0c;发现无法上网&#xff0c;尝试打开百度&#xff0c;但是出现以下图片&#xff1a; 经过检查&#xff0c;发现手机是可以上网的&#xff0c;说明网络本身并没有问题&#xff0c;对防火墙进行了一些设置…...

java多功能手机

随着科技的发展&#xff0c;手机的使用已经普及到每个家庭甚至个人&#xff0c;手机的属性越来越强大&#xff0c;功能也越来越多&#xff0c;因此人们在生活中越来越依赖于手机。 任务要求&#xff0c;使用所学知识编写一个手机属性及功能分析程序设计&#xff0c;测试各个手机…...

(学习日记)2024.04.26:UCOSIII第五十节:User文件夹函数概览(uC-CPU文件夹)

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…...

Python_AI库 Pandas的数据结构及基本操作

Python_AI库 Pandas的数据结构及基本操作 本文默认读者具备以下技能&#xff1a; 熟悉python基础知识&#xff0c;vscode或其它编辑工具 熟悉表格文件的基本操作 具备自主扩展学习能力 本文篇幅较长&#xff0c;但比较重要&#xff0c;希望读者可以认真看完并实例运行。 Pa…...

Ollama常用信息

目录 常用命令 常用模型 运行模型 常用命令 输入 Ollama 命令&#xff0c;正常的得出命令行输出&#xff0c;表示已经安装成功&#xff0c;下面有 ollama 的常用命令&#xff1a; Usage:ollama [flags]ollama [command]Available Commands:serve Start ollamacreate…...