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)及示例源码分析 的相关文章

  • 如何在windows上安装mongoDB?

    我正在尝试测试 mongoDB 看看它是否适合我 我下载了 32 位 Windows 版本 但不知道如何继续 我通常使用 WAMP 服务在本地计算机上进行开发 我可以在 Wamp 上运行 mongoDB 吗 但是 使它在 Windows 上
  • 如何保护自己免受内存消耗失控导致电脑崩溃的情况?

    我时不时地发现自己做了一些相当愚蠢的事情 导致我的程序分配它可以获得的所有内存 然后分配一些内存 过去 这种情况会导致程序因 内存不足 错误而很快死掉 但现在 Windows 会不遗余力地将这些不存在的内存提供给应用程序 而且实际上显然已经
  • 剪贴板大小限制

    复制到剪贴板的数据大小是否有限制 我正在使用 VB6 需要将数据块复制到剪贴板 应用程序调用GlobalAlloc GMEM MOVEABLE or GMEM DDESHARE 为要存储在剪贴板上的数据分配内存并使其可供其他应用程序使用 对
  • 在应用程序启动时禁用 Windows 服务

    因为我必须在应用程序启动时关闭 Windows 高级文本服务 有什么特殊的API吗 它适用于具有默认权限的用户吗 该问题的标题是 禁用 Windows 服务 但答案都告诉我们如何停止服务 您在 Google 上会发现的大部分内容是 您可以使
  • 如何在 C++ 中更改活动桌面壁纸

    你好 我想写一个小程序来更改 Windows 7 中的壁纸 我想使用以下代码 include windows h include wininet h include shlobj h include wchar h include
  • 如何在Windows服务程序中捕获SERVICE_CONTROL_SHUTDOWN代码

    我最近正在编写一个Windows服务程序 我在编程时遇到的问题是 当我在 Windows 操作系统上安装程序时 它无法正常关闭 关闭系统需要很长时间 看来我的程序是问题的原因 我试图在互联网上找到解决方案 我发现在我的代码中添加 SERVI
  • SQL Server 的 mysqldump 等效项

    SQL Server 是否有与 MySQL 具有 mysqldump 等效的模式和数据导出 转储工具 试图重新定位旧的 ASP 站点 但我对在 Windows 服务器上工作感到很不高兴 注意 DTS 导出实用程序自己似乎可以导出数据 而无需
  • 哪里可以下载 Microsoft.Phone.WinJS.2.1?

    我正在尝试使用 WinJS 制作通用 Windows 应用程序 我已经下载了VS2013的最新更新 RC 版本 我已经安装了我能找到的所有 SDK 我还安装了 WinLibJS VSE exe 扩展 有趣的是 VS 更新一直说我没有 当我打
  • C# Winforms 不规则的 Windows [重复]

    这个问题在这里已经有答案了 如何使用 WinForms 和 C 创建不规则形状的窗口 有几种不同的方法可以实现这一目标 一是用用TransparencyKey 正如尼夫勒在帖子中指出的那样 另一种是分配一个Region http msdn
  • NodeJS 连接到 SQL Server getaddrinfo ENOTFOUNT

    我正在尝试使用 Knex js 连接到 Microsoft SQL Server 但收到 getaddrinfo ENOTFOUND 我知道这表明 NodeJS 无法解析地址 通常是通过 DNS 或协议问题 const knex requi
  • Node npm windows 文件路径太长,无法安装包

    情况 我想在Windows托管的开发环境中使用gulp和相关的前端工具链 我在尝试使用 Browser Sync 之类的 gulp 插件时遇到了困难 因为 node modules 文件夹图呈扇形分布 使得 Windows 文件路径太长而无
  • Windows 7 跳转列表(Windows 窗体、C#)

    有谁知道如何在 C 中自定义与我自己的应用程序相关的 Windows 跳转列表功能 我知道可以做到 但我在 MSDN 上找不到任何与 C Windows7 相关的内容 到目前为止 我能找到的与 W7 和 C 相关的唯一信息只是我已经阅读过的
  • 每次批量从选择中获取随机句子

    有没有一种方法可以做到这一点 而不是每次都设置相同的回显 您可以给出一个回显列表 并且每次到达该回显命令时它都会选择一个随机的回显 是的 这是一个概念证明 echo off setlocal enabledelayedexpansion s
  • 只响应第一个 WM_KEYDOWN 通知?

    Win32 应用程序如何仅响应第一个 WM KEYDOWN 通知 MSDN 文档声称第 30 位 指定先前的按键状态 如果在发送消息之前按键处于按下状态 则该值为 1 如果按键处于按下状态 则该值为 0 但在我的 WndProc 中 第 3
  • “sed” 在文件中插入反斜杠

    Tool Windows 版 Git Bash Problem 尝试在目录中每个文件的顶部插入文本 connectcentral Code for f in DIR sql do sed i 1i connect central f don
  • 开始作业时无法识别功能

    我在模块 sysinfo psm1 中创建了一个函数 Get Uptime 并导入了该模块 C pstools gt get command Module sysinfo CommandType Name Definition Functi
  • “PWC6345:调用 javac 时出错。”使用 Jetty WTP 插件在 Jetty 上部署 JSP 页面时出错

    我正在尝试在 Jetty 上部署 JSP 页面 使用Jetty WTP 插件 http wiki eclipse org Jetty WTP Plugin对于 Eclipse 但我收到以下错误 Jetty 好像找不到javac 我需要在 E
  • 如何使用 DLL 来模拟静态库的“应用程序内全局变量的多个实例”行为?

    我们有一个用 C C 编写的应用程序 它被分解为单个 EXE 和多个 DLL 这些 DLL 中的每一个都使用相同的静态库 utilities lib 实用程序静态库中的任何全局变量实际上在应用程序内运行时都会有多个实例 每个模块 即 DLL
  • 强制节点在 Windows 上使用 git bash

    我有一个 package json 文件 如下所示 name APP version 3 0 0 private true scripts start node app js test test dbLoad env db test tes
  • 如何检查程序是否在 Windows 上的 Ubuntu 上的 Bash 中运行,而不仅仅是普通的 Ubuntu?

    非常简单 确定您所使用的操作系统的通常位置似乎与 Ubuntu for Windows 上的普通 Ubuntu 相同 例如uname a与本机 GNU Linux 安装相同并且 etc os version与 Ubuntu Trusty T

随机推荐

  • 仿京东 项目笔记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 欢迎大家提出意见