Window XP驱动开发(二) 环境搭建(VS2008+WDK+DDKWzard)及示例源码分析

2023-11-06

郁闷,做了WCE嵌入式驱动这么久还没热身够,又被调到做window xp下的驱动开发。没办法。只能受令了。

现在就开始自己的学习之旅吧。

转载请标明是引用于 http://blog.csdn.net/chenyujing1234 

欢迎大家提出意见,一起讨论!

示例源码:(VS2008)

 

window的驱动开发有两种方法 DDK与WDK,我选择WDK,因为 windows xp 驱动开发(三)DDK与WDK 的区别

=================================================================

转自: http://www.cnblogs.com/wangjunchao/archive/2010/09/15/DDKSetup.html

开发驱动,首先就是搭建开发的环境。既然是开发windows下的驱动程序,那MS的开发工具是一定要的。现在vs都到2010了,所以,也不能总是抱着vs6.0写代码,也要与时俱进~当然又不能太潮流吗……所以选用vs2008开发驱动。好了废话不多说了,下面记录一下我搭环境的步骤。只是个人的经历和测试,免不了会有些错,希望大家能指出。

一、VS2008的安装

这个……大家肯定比我熟的多,所以就不再显眼了。

vs2008的下载及正版升级见:http://bbs.51aspx.com/showtopic-1714.html

vs2008的详细安装见:Visual Studio 2008系列教程(一):VS 2008安装详解!

ok 接下来该驱动开发的核心了……

二、WDK的介绍、下载、安装及配制

1、关于WDK

Windows Driver Kit(驱动程序工具包): 是一种完全集成的驱动程序开发系统,它包含 Windows Driver Device Kit (DDK),用于测试 Windows 驱动程序的可靠性和稳定性,包括:

2、下载WDK

曾经下载WDK好像还必须得http://connect.microsoft.com/注册后才能下载,而且下载后还有一句提示:

提醒:您必须接受附带的许可条款才能使用此软件。不得分发下载软件包。”

所以当时下载的时候还要走一些不得不走的路。不过,今天好像发现WDK能直接下载了

下载地址:http://download.microsoft.com/download/4/A/2/4A25C7D5-EFBE-4182-B6A9-AE6850409A78/GRMWDK_EN_7600_1.ISO

如果不能正常下载,具体操作请见如何下载WDK

3、安装WDK

 

1、用虚拟光驱加载下载好的.ISO镜像文件,双击运行,出现下面亲切的画面
image

注意:因为我们的安装文件是GRMWDK_EN_7600_1.ISO,而如果我们的电脑上安装了 UltraISO软件,那么默认是用它打开的,这时我们双击KitSetup.exe,时会提示出错信息:KitSetup Base Initailization Error!(Code: 0x00022)  Missing Software Kit Object Model(SKOM)definition for kit......

原因:这是因为我们没有把.iso文件全部解压,安装时提示安装文件缺失。

解决方法:右击GRMWDK_EN_7600_1.ISO,选择UtraISO->安装到驱动器H盘。然后到我的电脑的驱动器H盘安装。

 

2、接触,出现以下画面,在左侧的树形复选框中选择要安装的组件及工具,建议全部安装,选择好后点击“OK”~~后面的就简单了~ 
image 

3、尔后,一路确定默认即可

image

 

三、DDKWzard的介绍、下载、安装及配制

在VS2008IDE中没有提供驱动开发的项目选项,当然可以用普通工程,然后手动在VS中配制相应的编辑连接以及调试选项,但是如此一来,每次都要重复些复杂的步骤。在http://ddkwizard.assarbad.net/网站上发现了一个很好用的辅助工具DDKWizard,能够方便地对开发环境进行配置,真是适合想我这样懒人啊,工具的作者也自称是因为懒惰才开发此工具,看来“懒惰是推动科技发展的动力”一点不假 。

  • DDKwzard安装需要三个文件:DDKWzard主程序:安装VS2008的项目模板ddkwizard_setup.exe
  • DDKBUILD.CMD:应该是用VS2008调用WDK编辑编译器的一系列脚本dkbuild_cmd.zip
  • DDKBUILD.BAT :估计也是是用VS2008调用WDK编辑编译器的一系列脚本ddkbuild_bat.zip

  1. 安装ddkwizard_setup,默认安装,一路Next点过即可,将DDKBUILD.CMD与DDKBUILD.BAT考到WDK的安装目录,或者其它目录也行,只要在后续的设置就行。如:我将其放在wdk的目录下,如图 
    image    
     
  2. 设置环境变量 
    添加相应的环境变量,如要开发XP系统下的驱动则添加WXPBASE,变量值为WDK的根目录,如图 

  3. 如果为其它系统开发驱动则填写相应的环境变量 
    NT 4.0 ———–NT4BASE

    windows2000—-W2KBASE

    windowsXP——-WXPBASE

    windows2003—-WNETBASE

    win7/2008 R2—-W7BASE

  4. 打开VS 2008,菜单“工具”->“选项”->左侧“项目和解决方案”->“VC++目录”->右侧“可执行文件”下拉列表->添加一项D:\WINDDK(根据你的实际情况,就是第1步中DDKBUILD.CMD与DDKBUILD.BAT所在的路径)。 
    image 
     
  5. 然后就可以在我们的VS2008中新建项目了,如下图,在Visual C++选项卡中多了DDK Project的项目类型,选择相应的模板添加我们的项目,点击确定 
    image
  6. 确定后出现DDKWzard的项目创建页面,在“Choose the DDKBUILD you want to use”中选择“ddkbuild.cmd”或者“ddkbuild.bat”,在其下面选择我们要为Who(2000,xp……)开发的驱动。 
    最后finish 
    image
  7. 在解决方案中便是由DDKWzard为我们自动生成的一个简单的驱动程序框架。 
     image 
  8. 最后点击F7生成解决方案,成功生成后在项目的objchk_win7_x86\i386文件夹下会生成几个文件 
  9. driver1.obj —编译生成的2进制文件 
    driver1.pdb—用于调试时使用的符号文件 
    vc90.pdb—–用于调试时使用的符号文件 
    driver1.sys—就是我们拭目以待的驱动程序文件 
     终于见到久违的驱动了~~~!!!

四:可能出现的错误

  • error PRJ0019: 某个工具从以下位置返回了错误代码: "正在执行生成文件项目操作" 
    错误原因:没有设置“项目和解决方案”中的“VC++目录” 
    image image 
    解决方案:在“工具”->“选项”->“项目和解决方案”->“VC++目录”->“可执行文件”添加ddkbuild.cmd和ddkbuild.bat所在的路径。 
  • 错误的结果 3 (从“C:/WINDOWS/system32/cmd.exe”返回)。    
    错误原因:没有设置环境变量 
    image 
    image 
    解决方案:添加相应的环境变量

        Error: "fatal error U1087: cannot have : and :: dependents for same target"

         解决方案: 解保你的编译路径中没空格.





 

五:友情提示

在用VS2008开发驱动时,建议在菜单“视图”->“输出”(或快捷键:Ctrl+W,O)开启项目的输出显示,能显示项目生成时的细节!


============================================================================================================================
在原有作者的基础上我做一下第一个Demo的源码分析:
文件组成:
makefile
sources              指定编译的源文件、资源文件及目标文件、目标类型
Driver3.vsprops 指定编译器的版本及宏的路径(ddkbuild.bat)
Driver3.cpp        源文件

Driver3.h

 

1、  在Driver3.h里包含头文件

#include "drvcommon.h"
#include "drvversion.h"

在drvcommon.h里有一个重要的宏

#define PRESET_UNICODE_STRING(symbol, buffer) \
        UNICODE_STRING symbol = \
            { \
            sizeof(WIDESTRING(buffer)) - sizeof(WCHAR), \
            sizeof(WIDESTRING(buffer)), \
            WIDESTRING(buffer) \
            };

 

通过它drvcommon.h里定义变量usDeviceName、usSymlinkName,这两个变量在Drivers.cpp里的DriverEntry、DRIVER3_DriverUnload函数中被调用。

#define DEVICE_NAME			"\\Device\\DRIVER3_DeviceName"
#define SYMLINK_NAME		         "\\DosDevices\\DRIVER3_DeviceName"
PRESET_UNICODE_STRING(usDeviceName, DEVICE_NAME);
PRESET_UNICODE_STRING(usSymlinkName, SYMLINK_NAME);


 

 

2、在Driver3.cpp包含头文件

#include <ntddk.h>    //   在D:\WINDDK\3790.1830\inc\ddk\wxp
#include <string.h>  

#include "Driver3.h"

 

在第一点中讲到了DriverEntry、DRIVER3_DriverUnload两函数。下面重点介绍.

2、1 DriverEntry

一个特定的驱动程序可能会被一个以上的相似硬件所使用,并且存在一些只需要在其第一次加载时被执行一次的全局初始化操作。DriverEntry程序负责这些全局初始化操。

注:

如果你用的是标准的编译程序,你能以“DriverEntry”程序为主入口点来调用内核模式驱动程序,这是因为在构建脚本(Build Script)中已经定义,其会命令连接器将其连接为默认的主入口点,你最好也令你的代码和这相符(否则修改构建脚本,但这有必要么?)


我有时使用extern “C”编译指令这是因为我通常在C++编译单元中打包我的代码——主要是这样我可以随时声明变量来而不用像C语言中只能在左大括号的后面声明。该预编译指令将禁止编译器生成C++形式的外部函数名修饰,这样连接器就能找到该函数。使用这个指令编译后,驱动程序入口函数的外部名将为_DriverEntry@8

关于需要你注意的该函数原型的最后一点是其声明了一NTSTATUS值作为返回值。NTSTATUS实际上只是一个长整型。但为了你代码更好的可读性你应该用类型定义名NTSTATUS来代替LONG。很多内核模式支持程序都能返回NTSTATUS状态码,状态码的定义你可以在DDK的头文件NTSTATUS.H中找到。关于状态码在下一章我将会介绍更多。目前,你只需知道当你的DriverEntry函数执行完毕时其会返回状态码。

DriverEntry的第一个参数是一个指针,指向一个刚被初始化的驱动程序对象该对象就代表你的驱动程序。WDM驱动程序的DriverEntry程序会完成对这个对象的初始化并返回。而非WDM驱动程序则有大量额外的工作要做——它们必须探测自己的硬件,为硬件创建设备对象(用于代表硬件),配置并初始化硬件使其正常工作。
  DriverEntry的第二个参数是注册表中设备服务键的键名。这个串不是长期存在的(函数返回后可能消失),如果你打算以后再使用该串则必须先把它复制到安全的地方。在WDM中我曾经构造该串的唯一用途是将其作为WMI注册的一部分

WDM驱动程序的DriverEntry的主要工作是给驱动对象填入各种的函数指针。这些指针为操作系统指明了驱动程序容器中各种子程序的位置。驱动对象中的指针包括如下内容:

         DriverUnload

    用来来指向你创建的清除程序。I/O管理器只会在卸载驱动之前调用该程序。如果没有任何需要清除的,你需要给系统一个DriverUnload函数来动态地卸载你的驱动。

         DriverExtension->AddDevice

    用来指向AddDevice函数。即插即用管理器会为每一个你负责的硬件实例调用一次AddDevice。由于AddDevice对于WDM驱动的工作方式非常要             

        DriverStartIo

如果驱动程序使用标准的队列I/O请求方式,你应该设置这组驱动对象指向StartIo程序。不要担心(但确实是这样)是否明白我所说的“标准的”队列方式。其实你会发现WDM驱动不应该使用它。

         MajorFunction

    I/O管理器初始化该函数指针向量来指向哑元派遣函数,该哑元派遣函数返回每个请求的失败。你大概只需要处理几种IRP的类型——否则驱动程序基本上就废了,所以至少应该设置与那几种IRP类型相对应的指针元素,使它们指向相应的派遣函数。

 
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
				 	 IN PUNICODE_STRING RegistryPath)
{
	NTSTATUS ntStatus = STATUS_SUCCESS;

	// 设定了在驱动中别处的函数指针的入口点
	DriverObject->DriverExtension->AddDevice = TestAddDevice;
	DriverObject->DriverUnload = TestDrvUnload;	
	
	// 设置请求派遣函数
    DriverObject->MajorFunction[IRP_MJ_PNP] = TestPnpIrp;
    DriverObject->MajorFunction[IRP_MJ_POWER] = TestPowerIrp;

	DriverObject->MajorFunction[IRP_MJ_CREATE] = TestCreate;
    DriverObject->MajorFunction[IRP_MJ_CLOSE] = TestClose;
	
	DriverObject->MajorFunction[IRP_MJ_READ] = TestRead;
	DriverObject->MajorFunction[IRP_MJ_WRITE] = TestWrite;
    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = TestIOCTL;
	

	// 复制RegistryPath字符串,使在驱动的别的地方可以访问注册表服务键值
	servkey.Buffer = (PWSTR) ExAllocatePool(PagedPool,  RegistryPath->Length + sizeof(WCHAR)); 
	if (!servkey.Buffer)      
		return STATUS_INSUFFICIENT_RESOURCES;    
	servkey.MaximumLength = RegistryPath->Length + sizeof(WCHAR);   
	RtlCopyUnicodeString(&servkey, RegistryPath);   
	servkey.Buffer[RegistryPath->Length/sizeof(WCHAR)] = 0;

	return ntStatus;
}
2、2  DriverUnload

WDM驱动的DriverUnload函数的目的是清理DriverEntry所做的所有全局初始化操作。其几乎无事可做。若你在DriverEntry中复制了RegistryPath字符串,DriverUnload则会在此释放内存。代码如下:

void TestDrvUnload(IN PDRIVER_OBJECT DriverObject)
{
	RtlFreeUnicodeString(&servkey);
}


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Window XP驱动开发(二) 环境搭建(VS2008+WDK+DDKWzard)及示例源码分析 的相关文章

  • 如何调用 LogonUser() 来获取启用了 UAC 的 Windows 服务中的非限制完整令牌?

    我正在 Windows Server 2012 上运行 WindowsService 它需要模拟域管理员用户 该用户也被添加到计算机上的本地管理员组 系统上启用了 UAC 并且使用 LogonType 为 LOGON32 LOGON INT
  • 使用 Python 将 Excel 中的图表导出为图像

    我一直在尝试将 Excel 中的图表导出为 Python 中的图像文件 JPG 或 ING 我正在查看 WIn32com 这是我到目前为止所拥有的 import win32com client as win32 excel win32 ge
  • 在新窗口中打开 SAS 程序

    目前 当您在 Windows 中双击 SAS 文件时 它将在您已打开的现有 SAS 会话中打开它 有没有办法让它在窗口中单击时会启动一个新的 SAS 窗口 据我所知 SAS 是一个所谓的 单实例 应用程序 因此它的默认行为是在现有会话中打开
  • 在 Windows 2008 上将 myprogram.exe 作为服务运行时出现问题

    MyProgram exe 是用来侦听来自管道的请求并使用命令提示符使其工作完美 但我尝试使用 Windows 服务来工作但没有成功我在 Windows Server 2008 Enterprise 上尝试了以下步骤 gt sc creat
  • Python 可执行文件:py2exe 还是 PyInstaller?

    要创建可执行文件 Windows 我假设我们应该使用其中之一 Py2exe 或 PyInstaller 它们之间有什么区别 Py2exe 和 PyInstaller 都是包装器 但我注意到以下几点差异 Py2exe 与 python2 4
  • 为什么 cygwin 无法读取我的主目录中的 .ssh/config 文件?

    我正在使用 cygwin 并且正在尝试设置 ssh config 文件 Cygwin 的文件夹位于我的 C 驱动器中 我的主目录是 C Users USER 我注意到 当我编辑 C Users USER ssh config 时 cygwi
  • .wav 文件长度/持续时间,无需读入文件

    有没有办法提取有关 wav 文件长度 持续时间的信息 而无需在 R 中读取文件 我有数千个这样的文件 如果我必须阅读每个文件才能找到其持续时间 那将需要很长时间 Windows 文件资源管理器为您提供了打开 长度 字段的选项 并且您可以查看
  • 导入错误:无法导入名称线程

    这是我第一次学习Python 我继续尝试线程这篇博文 http www saltycrane com blog 2008 09 simplistic python thread example 问题是它似乎已经过时了 import time
  • 如何更改选项卡控件的名称

    我在 C WinForms 应用程序中使用选项卡控件 我想更改选项卡的标题 默认情况下它们是 tabPage1 tabPage2 等 一种无需代码即可实现的懒惰方法 选择选项卡控件 Go to properties use F4 to do
  • 嵌入清单文件以要求具有 mingw32 的管理员执行级别

    我正在 ubuntu 下使用 i586 mingw32msvc 交叉编译应用程序 我很难理解如何嵌入清单文件以要求 mingw32 具有管理员执行级别 对于我的例子 我使用了这个hello c int main return 0 这个资源文
  • 更改 mingw' 启动目录或创建 mingw 符号链接

    设置 mingw 控制台启动目录的最简单方法是什么 我只使用 mingw 进行编译 但由于缺乏编辑器甚至符号链接 我很困惑如何告诉 mingw 控制台出现在不同的目录而不是常规的主目录中 如果有人知道如何像 cygwin 那样将 真正的 符
  • 用于验证 IIS 设置的 Powershell 脚本

    是否可以使用 Power Shell 脚本获取 IIS 设置 我希望使用脚本获取 检查以下信息 检查 Windows 身份验证提供程序是否正确列出 协商 NTLM 检查是否启用了 Windows 身份验证 Windows 身份验证高级设置
  • 设置 Form.KeyPreview = true 的缺点?

    我想知道 Form KeyPreview 属性实际上有什么用处 它为什么存在以及将其设置为 true 会带来什么 风险 我想它一定有some负面影响 否则它根本不应该存在 或者至少默认情况下是正确的 EDIT 我很清楚what确实如此 我问
  • Kerberos 双跳

    我们遇到了臭名昭著的 Kerberos 双跳问题 这是一个全新的域 是从以前使用模拟和委派的另一个提供商迁移而来的 我们已将操作系统升级到最新的 SQL 服务器 2017 WPF 应用程序 使用域凭据 gt Web 服务 IIS 10 上的
  • 在 Cygwin 软件包列表中找不到 Openssl

    这里说的是https github com joyent node wiki Building node js on Cygwin Windows https github com joyent node wiki Building nod
  • 本地推送通知到在应用程序内运行 JS 代码的 Win8 Live Tile

    我正在尝试将更新发送到我的应用程序的磁贴 当应用程序运行时 这可以正常工作 例如 当用户单击按钮时 我可以轻松地将磁贴更新通知发送到磁贴 我无法解决的是当应用程序无法运行时如何更新磁贴 我找到的唯一选择是使用以下命令从远程 Web 服务器拉
  • 需要 TensorFlow 依赖项。如何在 Windows 上运行 TensorFlow

    我有兴趣让 TensorFlow 在 Windows 上运行 但目前我意识到这是不可能的 因为某些依赖项无法在 Windows 上使用 例如巴泽尔 之所以出现这种需求 是因为据我目前了解 从 TensorFlow 访问 GPU 的唯一方法是
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 为什么我只能用管理员权限才能导入Python中的某些模块?

    我正在努力解决 Python 2 7 中的一些奇怪问题 我写了一个很长的工具 在其中导入不同的模块 我必须首先使用它安装pip 该工具将在公司内部共享 不同的用户在其特定机器上拥有不同的权限 当另一个用户登录我的计算机 我在那里拥有管理员权
  • 如何为最终用户方便地启动Java GUI程序

    用户想要从以下位置启动 Java GUI 应用程序Windows 以及一些额外的 JVM 参数 例如 javaw Djava util logging config file logging properties jar MyGUI jar

随机推荐

  • 仿京东 项目笔记2(注册登录)

    这里写目录标题 1 注册页面 1 1 注册 登录页面 接口请求 1 2 Vue开发中Element UI的样式穿透 1 2 1 v deep的使用 1 2 2 elementUI Dialog内容区域显示滚动条 1 3 注册页面 步骤条和表
  • 服务器i5 和e系列,e5和i5有什么区别

    两个系列的处理器主要在设计规格和面向范围方面存在区别 设计规格上 前者核心数更多 多线程能力更强 但睿频能力相对较弱 后者核心数较少 多线程能力不如前者 但睿频能力更强 面向范围上 前者主要面向服务器 嵌入式等企业设备 后者主要面向消费级硬
  • (LeetCode)全排列

    目录 题目要求 题目理解以及思路分析 代码分部讲解 第一部分 第二部分 题目要求 给定一个不含重复数字的数组 nums 返回其 所有可能的全排列 你可以 按任意顺序 返回答案 示例 1 输入 nums 1 2 3 输出 1 2 3 1 3
  • 规则引擎Drools使用 第十一篇 Drools 的高级语法之LHS增强

    前面我们已经知道了在规则体中的LHS部分是介于when和then之间的部分 主要用于模式匹配 只有匹配结果为true时 才会触发RHS部分的执行 下面我们会针对LHS部分学习几个新的用法 目录 复合值限制in not in 条件元素eval
  • 升压电路(BOOST)与降压电路(BUCK)

    一 电路中产生电流的条件是 1 电路里必须有电源供电 2 电路必须形成闭合回路 降压元器件 升降压电路构成的核心元器件 1 电感 储存能量 电感是无法突变的 工作状态是线性的 2 二极管 3 mos管 首先先分清楚mos是N mos还是P
  • Qt全局宏和变量

    1 Qt 全局宏定义 Qt版本号 QT VERSION major lt lt 16 minor lt lt 8 patch 检测版本号 QT VERSION CHECK major minor patch major lt lt 16 m
  • virtio代码分析(一)-qemu部分

    virtio内容众多 代码分布于qemu linux dpdk等中 而且分为frontend和backend 可以运行于userspace也可以运行于kernelspace 极其难以理解 不看代码只看原理性文档往往流于表面 只有真正看懂了代
  • 大数据准备——安装JDK

    1 解压Linux版本的JDK压缩包 命令行敲入 mkdir home software cd home software rz 上传jdk tar包 这里添加自己tar包的名字 如果rz命令不能使用 先执行yum install lrzs
  • C语言关键字解析

    在C语言中有32个关键字 如下表所示 释 1 声明 1 告诉编译器 这个名字已经匹配到一块内存上 2 告诉编译器 这个名字已经预定了 其他地方再也不能用它来作为变量名或对象名 2 定义 编译器创建一个对象 为这个对象分配一块内存空间 并给它
  • 前端 配色网站 自用 免费 颜色很全

    1 中国色彩 http zhongguose com 3 ColorHex https www colorhexa com 4 优色网配色专区 https color uisdc com 4 ColorDrop https www colo
  • cuda学习

    GPU中有多个流处理器SM 当一个线程块被指定给一个SM后 里面的线程会被划分成线程束 32个线程 在SM上交替运行 也就是说SM上一个时刻只有一个线程束在运行 函数修饰符 global 表示该函数只能在GPU上运行 但是可以从CPU或者G
  • qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method

    最近在做一个网络音乐播放器时 由于出现qt network ssl QSslSocket cannot call unresolved function SSLv23 client method 而不能播放网络歌曲 上网搜了半天 都说要在电
  • Jmeter(二十七) - 从入门到精通 - Jmeter Http协议录制脚本(详解教程)

    1 简介 LoadRunner的录制功能让性能测试脚本编写对于不懂代码的人变成了一件容易上手的事 但是由于LoadRunner收费高昂 庞大 一般企业很少用 除非必须使用 Jmeter作为性能测试中的王者也少不了提供录制功能 Jmeter的
  • 靠!我被项目经理和同事嘲笑了,因为不会远程debug调试...

    大家好 我是曹尼玛 刚从培训机构毕业 去一家单位上班一周了 这一周项目经理让我熟悉了项目业务 架构和设计 不算难 凭借我培训机构第一名的成绩 还是很顺溜 今天项目经理把同事们叫到一起 说线上438x6项目出现奇葩问题 但是开发环境初步测试没
  • SSM框架练习—主从表的业务模型

    需要实现的整体功能 系统的登录并进行用户名的校验 团购信息的列表展示 团购信息的添加 团购信息的检索 1 数据库创建 CREATE DATABASE mydb USE mydb drop table if exists vaccunit C
  • MySQL数据库关于表的一系列操作

    MySQL中的数据类型 varchar 动态字符串类型 最长255位 可以根据实际长度来动态分配空间 例如 varchar 100 char 定长字符串 最长255位 存储空间是固定的 例如 char 10 int 整数型 最长11位 lo
  • 【数据结构 c语言版 】线性表的链式表示和实现

    目录 一 单链表的表示和实现 1 单链表的存储结构 1 1 头指针 头结点与首元结点 1 2 带头结点单链表和不带头结点单链表的比较 2 单链表的初始化 3 单链表的长度 4 单链表的插入 5 单链表的删除 6 单链表的查看 7 单链表的撤
  • auto-gpt部署:openai key, google api key,google engine id

    获取OpenAI API Key 1 打开platform openai com 输入你的OpenAI帐号和密码 2 点击左上角personal gt view api keys gt api keys gt create new scre
  • 不花钱,让"情圣"ChatGPT教你怎么追马斯克

    大家好 我是播妞 你知道吗 如今爆火的ChatGPT 曾经和马斯克还有一段七年的 纠葛 最近 OpenAI发布了史上最强聊天机器人ChatGPT 这个诞生于GPT 3基础上的AI很快走红网络 要说这家伙 天南海北无所不知 可能是夸张了点 但
  • Window XP驱动开发(二) 环境搭建(VS2008+WDK+DDKWzard)及示例源码分析

    郁闷 做了WCE嵌入式驱动这么久还没热身够 又被调到做window xp下的驱动开发 没办法 只能受令了 现在就开始自己的学习之旅吧 转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家提出意见