User-Mode Debugging with WinDriver

Debug Monitor is an essential tool for monitoring all activities handled by the WinDriver kernel. You can use this tool to track how each command sent to the kernel is executed.


User-Mode Debugging

In addition, WinDriver enables you to print your own debug messages to the Debug Monitor, using the WD_DebugAdd() function or the high-level PrintDbgMessage() function. Note that this function can be called from both user-mode and kernel-mode code (created using WinDriver’s Kernel PlugIn feature) and can also be called from within functions running at HIGH IRQL, such as the Kernel PlugIn KP_IntAtIrql() function.

The Debug Monitor comes in two versions:

  • wddebug_gui — a GUI version
  • wddebug — a console-mode version

Note that wddebug_gui is available for all supported Desktop operating system but is currently not available for Linux ARM/ARM64. For these platforms, use the console-mode wddebug.

Both Debug Monitor versions are provided in the WinDriver/util directory.

Please note that WD_DebugAdd() function can be called from both user-mode and kernel-mode code (created using WinDriver’s Kernel PlugIn feature) and can also be called from within functions running at HIGH IRQL, such as the Kernel PlugIn KP_IntAtIrql() function.

You can also select to send the debug messages to a kernel debugger, instead of to the Debug Monitor log, as we explain further. This can enable you, for example, to log the debug message on another PC in case the system crashes (BSOD) or hangs on the development PC.

Most of the WinDriver functions have a return value to indicate success or a relevant error code, which can assist you in the debugging process. The return status codes are defined in the [WD_ERROR_CODES] (WD_ERROR_CODES) enum.

When developing code in the kernel using the Kernel PlugIn, you can also use any kernel debugger in the debugging process (e.g., WinDbg — which is distributed with the Windows Driver Kit (WDK) and is part of the Debugging Tools for Windows package, distributed via the Microsoft website). As mentioned above, you can also select to direct the debug message from the Debug Monitor to a kernel debugger of your choice.


Debug Monitor

The Debug Monitor utility logs debug messages from WinDriver’s kernel-mode and usermode APIs. You can also use WinDriver APIs to send your own debug messages to the Debug Monitor log.

When using WinDriver’s API (such as WD_Transfer()), to read/write memory ranges on the card in the kernel, while the Debug Monitor is activated, WinDriver’s kernel module validates the memory ranges, i.e., it verifies that the reading/writing from/to the memory is in the range that is defined for the card.

Use DriverWizard to check values of memory, registers and configuration in the debugging process.

The wddebug_gui Utility

wddebug_gui is a fully graphical (GUI) version of the Debug Monitor utility for Windows and Linux.

  • Run the Debug Monitor using either of the following methods:
    • Run WinDriver/util/wddebug_gui.
    • Run the Debug Monitor from DriverWizard’s Tools menu.
    • On Windows, choose Start | Programs | WinDriver | Debug Monitor.

Start Debug Monitor

  • Set the Debug Monitor’s status, trace level and debug sections information from the Debug Options dialogue, which is activated either from the Debug Monitor’s View | Debug Options menu or the Debug Options toolbar button.

Debug Options

Status — Set trace on or off. Section — Choose what part of the WinDriver API you would like to monitor.

For example, if you are experiencing problems with the interrupt handler on your PCI card, select the PCI and Interrupts sections. USB developers should select the USB section.

Choose carefully those sections that you would like to monitor. Checking more options than necessary could result in an overflow of information, making it harder for you to locate your problem.

Level — Choose the level of messages you want to see for the resources defined. Error is the lowest trace level, resulting in minimum output to the screen. Trace is the highest trace level, displaying every operation the WinDriver kernel performs. Send debug messages to the operating system kernel debugger — Select this option to send the debug messages received from the WinDriver kernel module to an external kernel debugger, in addition to the Debug Monitor.

On Windows, the first time that you enable this option you will need to restart the PC. A free Windows kernel debugger, WinDbg, is distributed with the Windows Driver Kit (WDK) and is part of the Debugging Tools for Windows package, distributed via the Microsoft web site. Driver Name — This field displays the name of the driver currently being debugged. Changing it allows you to debug a renamed WinDriver driver.

  • Once you have defined what you want to trace and on what level, click OK to close the Debug Options window.
  • Optionally make additional configurations via the Debug Monitor menus and toolbar.

When debugging OS crashes or hangs, it’s useful to auto-save the Debug Monitor log, via the File | Toggle Auto-Save menu option (available also via a toolbar icon), in addition to sending the debug messages to the OS kernel debugger.

  • Run your application (step-by-step or in one run).

You can use the Edit | Add Custom Message… menu option (available also via a toolbar icon) to add custom messages to the log. This is especially useful for clearly marking different execution sections in the log.

  • Watch the Debug Monitor log (or the kernel debugger log, if enabled) for errors or any unexpected messages.

Search in wddebug_gui

wddebug_gui allows to find expressions in the Debug output in 4 ways:

  • Starting to type an expression with the keyboard immediately searches for it in the Debug output.
  • Pressing CTRL+F displays the Find field in the toolbar.
  • Clicking the Find icon in the toolbar.
  • Going to Edit | Find…

If an expression is found it is marked. It is possible to browse between occurences of an expression using Prev (F2) and Next (F3).

Search in wddebug_gui

Opening Windows kernel crash dump with wddebug_gui

In driver development, it is not uncommon to experience kernel crashes that lead to the Blue Screen of Death (BSOD). In order to assist developers in debugging and solving these crashes, WinDriver allows saving its kernel debug messages in the memory dump that Windows automatically creates when the system crashes. These crash dumps can later be opened in wddebug_gui after the system was restarted.

To direct the debug messages to a kernel debugger, follow these steps:

  • Open your selected kernel debugger.
  • Run the Debug Monitor and select to direct the WinDriver debug messages to a kernel debugger, using either of the following methods:
    • Open the GUI version of the Debug Monitor — wddebug_gui (available on Windows, Linux, and MacOS), check the “Send debug messages to the operating system kernel debugger” option in the Debug Options window, and press ‘OK’.
    • Run the console-mode version of the Debug Monitor — wddebug (available on all the supported operating systems) — with the dbg_on command:
    WDDEBUG [{driver_name}] dbg_on [{level}] \
       [{sections}]
    
    • Load up the WinDriver symbols by going to File | Symbol File Path… and loading your driver’s symbols MyDriver.pdb (the file name for the default driver is lib / windrvr1640.pdb). Do not skip this step, otherwise the kernel dump might not be comprehensible.
    • Load the kernel crash dump (.dmp) file by going to File | Process Kernel Dump… wddebug_gui will display the output from the crash dump.

    Windows users can use Microsoft’s WinDbg tool, for example, this tool is distributed with the Windows Driver Kit (WDK) and is part of the Debugging Tools for Windows package, distributed via the Microsoft web site.

    Running wddebug_gui for a Renamed Driver

    By default, wddebug_gui logs messages from the default WinDriver kernel module — windrvr1640.sys/.dll/.o/.ko. However, you can also use wddebug_gui to log debug messages from a renamed version of this driver see Chapter 17: Driver Installation — Advanced Issues, in two ways:

    • From within wddebug_gui, by going to View | **Debug Options and changing the value of the “Driver name” field to your own renamed driver’s name.
    • By running wddebug_gui from the command line with the driver_name argument:
    `wddebug_gui <driver_name>`

    The driver name should be set to the name of the driver file without the file’s extension, e.g., windrvr1640, not windrvr1640.sys (on Windows) or windrvr1640.o (on Linux). For example, if you have renamed the default windrvr1640.sys driver on Windows to my_driver.sys, you can log messages from your driver by running the Debug Monitor using the following command:

    `wddebug_gui my_driver`
    

    The wddebug Utility

    Console-Mode wddebug Execution

    The wddebug version of the Debug Monitor utility can be executed as a console-mode application on all supported operating systems: Windows, and Linux. To use the console-mode Debug Monitor version, run WinDriver/util/wddebug in the manner explained below.

    wddebug console-mode usage

    wddebug [{driver_name}] [{command}] [{level}] [{sections}]
    

The wddebug arguments must be provided in the order in which they appear in the usage statement above.

  • <driver_name> — The name of the driver to which to apply the command.

The driver name should be set to the name of the WinDriver kernel module — windrvr1640 (default), or a renamed version of this driver (refer to the explanation in 17.2. Renaming the WinDriver Kernel Driver). We remind that the driver name should be set to the name of the driver file without the file’s extension, e.g., windrvr1640, not windrvr1640.sys (on Windows) or windrvr1640.o (on Linux).

  • <command>— The Debug Monitor command to execute.

Activation commands:

Command Description
on Turn the Debug Monitor on.
off Turn the Debug Monitor off.
dbg_on Redirect the debug messages from the Debug Monitor to a kernel debugger and turn the Debug Monitor on (if it was not already turned on).
On Windows, the first time that you enable this option you may need to restart the PC. The on and dbg_on commands can be used together with the <level> and <sections> arguments.
dbg_off Stop redirecting debug messages from the Debug Monitor to a kernel debugger.
dump Continuously send (“dump”) debug information to the command prompt, until the user selects to stop (by following the instructions displayed in the command prompt).
status Display information regarding the running driver (<driver_name>), the current Debug Monitor status — including the active debug level and sections (when the Debug Monitor is on) — and the size of the debug-messages buffer.
clock_on Add a timestamp to each debug message. The timestamps are relative to the driver-load time, or to the time of the last clock_reset command.
clock_off Do not add timestamps to the debug messages.
clock_reset Reset the debug-messages timestamps clock.
sect_info_on Add section(s) information to each debug message.
sect_info_off Do not add section(s) information to the debug messages.
help Display usage instructions.
No arguments (including no commands) This is equivalent to running ‘wddebug help’.

 
The following arguments are applicable only with the on or dbg_on commands:

Argument Description
<level> The debug trace level to set — one of the following flags: ERRORWARNINFO, or TRACE (default). ERROR is the lowest trace level and TRACE is the highest level (displays all messages).
When the <sections> argument is set, the <level> argument must be set as well (no default).
<sections> The debug sections — i.e., the WinDriver API sections — to monitor.

This argument can be set either to ALL (default) — to monitor all the supported debug sections — or to a quoted string that contains a combination of any of the supported debug-section flags (run ‘wddebug help’ to see the full list).

Usage Sequence

To log messages using wddebug, use the following sequence:

  • Turn on the Debug Monitor by running wddebug with either the on or dbg_on command; the latter redirects the debug messages to the OS kernel debugger before turning on the Debug Monitor.

You can use the <level> and <sections> arguments to set the debug level and sections for the log. If these arguments are not explicitly set, the default values will be used; (note that if you set the sections you must also set the level). You can also log messages from a renamed WinDriver driver by preceding the command with the name of the driver (default: windrvr1640) — see the <driver_name> argument.

  • If you did not select to redirect the debug messages to the OS kernel debugger (using the dbg_on command), run wddebug with the dump command to begin dumping debug messages to the command prompt.

You can turn off the display of the debug messages, at any time, by following the instructions displayed in the command prompt.

  • Run applications that use the driver, and view the debug messages as they are being logged to the command prompt/the kernel debugger.
  • At any time while the Debug Monitor is running, you can run wddebug with the following commands:
    • statusclock_onclock_offclock_resetsect_info_on, or sect_info_off.
    • on or dbg_on with different <level> and/or <sections> arguments.
    • dbg_on and dbg_off — to toggle the redirection of debug messages to the OS kernel debugger.
    • dump — to start a new dump of the debug log to the command prompt; (the dump can be stopped at any time by following the instructions in the prompt)
  • When you are ready, turn off the Debug Monitor by running wddebug with the off command.

The status command can be used to view information regarding the running WinDriver driver even when the Debug Monitor is off.

Example

The following is an example of a typical wddebug usage sequence. Since no <driver_name> is set, the commands are applied to the default driver — windrvr1640.

Turn the Debug Monitor on with the highest trace level for all sections:

wddebug on TRACE ALL

This is the same as running wddebug on TRACE, because ALL is the default <sections> value. Then dump the debug messages continuously to the command prompt or a file, until the user selects to stop:

wddebug dump
wddebug dump {filename}

Following that use the driver and view the debug messages in the command prompt. Turn the Debug Monitor off:

wddebug off

Debugging on a test machine

In order to debug your WinDriver application and driver a machine that does not have WinDriver installed on it:

  • Copy WinDriver\util\wddebug.exe to your testing machine.
  • Run wddebug dump from your target machine’s command line.
  • Run your application on a different window.
  • Stop wddebug utility using CTRL+C.
Full Benefits
Guidance
Features
Technical Data

Download WinDriver Free 30 Days Trial

Please fill the form below to download a fully featured WinDriver evaluation

Software License Agreement of WinDriver (TM) Version v16.4.0
© Jungo Connectivity Ltd. 2024 All Rights Reserved

IMPORTANT – READ CAREFULLY: THIS SOFTWARE LICENSE AGREEMENT (“AGREEMENT”) IS A LEGAL AGREEMENT BETWEEN YOU AND JUNGO CONNECTIVITY LTD. (“JUNGO”), FOR THE WINDRIVER SOFTWARE PRODUCT ACCOMPANYING THIS LICENSE (THE “SOFTWARE”). BY INSTALLING, COPYING OR OTHERWISE USING THE SOFTWARE, YOU AGREE TO BE LEGALLY BOUND BY THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT, DO NOT INSTALL, COPY, OR OTHERWISE USE THE SOFTWARE.

 

  1. OWNERSHIP OF THE SOFTWARE. All right, title, and interest in and to the Software, including associated intellectual property rights, of any sort and/or kind, are and shall remain solely with Jungo and its licensors, and may be protected by copyright, trademark, patent and trade secret law and international treaties. This Agreement does not convey to you an interest in or to the Software, but only a limited, non-transferable, non-sublicensable, non-exclusive, and revocable right of use, in accordance with the terms of this Agreement. You may not remove any proprietary notices and/or any legends from the Software, in whole or in part.

 

  1. GRANT OF LICENSE. Jungo hereby grants you a personal, non-exclusive, nontransferable, non-sublicensable node-locked and time limited license to use the Software.

 

    – Individuals: Jungo grants you, as an individual, a personal, non-exclusive, “single-user” license to use the Software on a single computer, in the manner provided below, at the site for which the license was given.

 

    – Entities: If you are an entity, Jungo grants you the right to designate one individual within your organization (and only one) to have the right to use the Software on a single computer, in the manner provided below, at the site for which the license was given.

 

    – License Scope: A single user license allows usage of WinDriver and redistribution of certain components (as defined below) within a single end product SKU, for a single device (identified by its VID/PID (USB) or VID/DID (PCI)), and without SDK/API capabilities.  If you need extended license or distribution rights, please contact Jungo.

 

  1. EVALUATION LICENSE. If you have not yet paid license fees for the use of the Software, then Jungo hereby grants you a personal, non-exclusive, non-transferable and non-sublicensable license to internally use the Software for evaluation purposes only, for a period of 30 days (the “Evaluation License”). If, after the expiration of the Evaluation License, you wish to continue using the Software and accompanying written materials, you may do so by remitting the required payment to Jungo, and you will then receive a registration code and a license string that will permit you to use the Software on a single computer under one of the license schemes specified in Section 2 above.

 

  1. SERVICE OPTIMIZATION AND ENHANCEMENT. To continuously improve and optimize Jungo’s services, Jungo reserves the right to anonymously monitor, collect, and analyze usage data, including but not limited to API interactions, performance metrics, and system activity. Such data collection and analysis shall be conducted in compliance with all applicable laws and regulations and shall be used solely for the purpose of enhancing service performance, security, and reliability.
  2. SUBSCRIPTION, SERVICE CONTINUITY, RENEWAL, AND LATE PAYMENT PENALTIES. Access to the WinDriver and its associated features is provided on a subscription basis, subject to annual renewal. Failure to renew the subscription before the expiration date may result in the automatic termination of access to the platform and all related services, and additional fees (including but not limited to late payment penalties, administrative charges, or reinstatement costs). Upon termination, the user shall forfeit any rights to continued use, and we reserve the right to suspend or delete any associated accounts, data, or functionalities without further notice.

 

  1. OPEN SOURCE. The Software includes certain files that are subject to open source licenses. These files are identified in their header files (“Open Source Files”). You must use the Open Source Files in accordance with the terms of their respective licenses.  In the event of any contradiction between the terms of this Agreement, and the terms of the open source license accompanying a certain Open Source File, the terms of the latter shall prevail, with regard to the said Open Source File.

 

RESTRICTIONS ON USE AND TRANSFER

 

  1. DISTRIBUTION OF FILES.

 

    (a) You may not distribute, or otherwise transfer or assign, any portion of the Software, including any of the headers or source files that are included in the Software, unless otherwise expressly permitted in this Agreement, subject to the provisions of Section 4 above.

 

    (b) Subject to your full and continued compliance with the terms of this Agreement, including the ongoing payment of annual license fees, you may distribute the following files:

 

Windows:
-windrvr1640.sys
-windrvr1640_legacy.sys
-windrvr1640.inf
-windrvr1640.cat
-wdapi1640.dll
-wdapi1640_32.dll
-wdapi1640_arm64.dll
-wdapi_dotnet1640.dll
-wdapi_dotnet1640_32.dll
-wdapi_netcore1640.dll
-wdapi_java1640.dll
-wdapi_java1640.jar
-wdreg.exe
-difxapi.dll
-devcon.exe
-windrvr1630.sys
-windrvr1630.inf
-wd1630.cat
-wdapi1630.dll
-wdapi_dotnet1630.dll
-wdapi_java1630.dll wdapi_java1600.jar
-windrvr1220.dll
-wdapi1220.dll

Linux:
-windrvr_gcc_v3.o_shipped
-windrvr_gcc_v3_regparm.o_shipped
-kp_linux_gcc_v3.o
-kp_linux_gcc_v3_regparm.o
-libwdapi1640.so libwdapi1640_32.so
-libwdapi_java1640.so
-libwdapi_java1640_32.so
-wdapi_java1640.jar
-wdapi_netcore1640.dll
-kp_wdapi1640_gcc_v3.o_shipped
-kp_wdapi1640_gcc_v3_regparm.o_shipped
-linux_wrappers.c
-linux_wrappers.h
-wdusb_linux.c
-wdusb_interface.h
-wd_ver.h
-linux_common.h
-windrvr.h
-windrvr_usb.h
-wdsriov_interface.h
-wdsriov_linux.c
-wdreg
-configure makefile.in
-configure.wd makefile.wd.in
-makefile.wd.kbuild.in
-configure.usb
-makefile.usb.in
-makefile.usb.kbuild.in
-setup_inst_dir
-windrvr_gcc_v2.a windrvr_gcc_v3.a windrvr_gcc_v3_regparm.a
-kp_linux_gcc_v2.o kp_linux_gcc_v3.o kp_linux_gcc_v3_regparm.o
-libwdapi1630.so
-libwdapi_java1630.so wdapi_java1600.java
-kp_wdapi1630_gcc_v2.a kp_wdapi1600_gcc_v3.a kp_wdapi1600_gcc_v3_regparm.a
-linux_wrappers.c linux_wrappers.h wdusb_linux.c
-wdusb_interface.h wd_ver.h linux_common.h windrvr.h windrvr_usb.h
-configure.wd makefile.wd.in makefile.wd.kbuild.in
-configure.usb makefile.usb.in makefile.usb.kbuild.in

macOS:
-libwdapi1640.dyld
-libwdapi_java1640.jar
-libwdapi_java1640.dyld
-wdapi_netcore1640.dll
-WinDriver1640.kext
-WinDriver1640.dext
-wd_mac_install.sh
-wd_mac_uninstall.sh

 

    (c) The files listed in Section 5.b above may be distributed only as part of a complete application that you distribute under your organization name, and only if they significantly contribute to the functionality of your application. For avoidance of doubt, each organization distributing these files as part of the organization products is required to have valid license(s) under the organization name/VID, irrespective of the party who actually performed the product development. Licenses granted to subcontractors do not grant distribution or other rights to the organizations for which they are developing.

 

    (d) The distribution of the windrvr.h header file is permitted only on Linux.

 

    (e) You may not modify the distributed files specified in Section 5.b of this Agreement.

 

    (f) You may not distribute any header file that describes the WinDriver functions, or functions that call the WinDriver functions and have the same basic functionality as that of the WinDriver functions.

 

  1. The Software may not be used to develop a development product, an API, or any products, which will eventually be part of a development product or environment, without the written consent of Jungo and subject to additional fees and licensing terms.

 

  1. You may make printed copies of the written materials accompanying the Software, provided that only users bound by this license use them.

 

  1. You may not allow any third party to use the Software, grant access to the Software (or any portion thereof) to any third party, or otherwise make any commercial use of the Software, including without limitation, assign, distribute, sublicense, transfer, pledge, lease, rent, or share your rights in the Software or any of your rights under this Agreement, all whether or not for any consideration.

 

  1. You may not translate, reverse engineer, decompile, disassemble, reproduce, duplicate, copy, or otherwise disseminate all or any part of the Software, or extract source code from the object code of the Software.

 

  1. Jungo reserves the right to revise, update, change, modify, add to, supplement, or delete any and all terms of this License Agreement; provided, however, that changes to this License Agreement will not be applied retroactively. Such changes will be effective with or without prior notice to you. You can review the most current version of this License Agreement under the WinDriver download form page.

 

  1. You may not incorporate or link any open source software with any open source software part of the Software, or otherwise take any action which may cause the Software or any portion thereof to be subjected to the terms of the Free Software Foundation’s General Public License (GPL) or Lesser General Public License (LGPL), or of any other open source code license.

 

  1. DISCLAIMER OF WARRANTY. THIS SOFTWARE AND ITS ACCOMPANYING WRITTEN MATERIALS ARE PROVIDED BY JUNGO “AS IS” WITHOUT ANY WARRANTY. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT, ARE HEREBY DISCLAIMED TO THE FULLEST EXTENT PERMITTED UNDER APPLICABLE LAW.

 

  1. NO LIABILITY. TO THE FULLEST EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL JUNGO OR ITS LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, SAVINGS, IP INFRINGEMENT OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

 

  1. Governing Law. This Agreement and use of the Software are governed by the laws of the State of Israel, regardless of its conflict of laws rules, and the competent courts of the State of Israel shall have sole and exclusive jurisdiction over any dispute under this Agreement or otherwise related to the Software.

 

  1. Confidentiality. The Software, including any additional information related thereto, contains confidential and proprietary information of Jungo.  Accordingly, you agree that you will not, nor allow any third party to, disseminate, transfer, grant access to, or otherwise disclose to any third party the Software or any part thereof or any other confidential or proprietary information of Jungo provided in connection therewith. You will maintain all copies of the Software and all related documentation in confidence.

 

  1. Termination and Effects of Termination. Jungo may terminate this Agreement and the licenses granted to you hereunder at any time if you breach any of your obligations hereunder, by issuance of written notice to such effect, addressed to you at the address you provided in your registration form. Upon expiration or other termination of this Agreement, the Licenses granted to you hereunder shall immediately and automatically be canceled, and you will immediately remove all copies of the Software from your computer(s) and cease any use thereof.

 

  1. Contact Details. If you have any questions concerning this Agreement or wish to contact Jungo for any reason —

 

          Web site: https://www.jungo.com

          Email:    [email protected]

 

  1. US GOVERNMENT RESTRICTED RIGHTS. The Software and documentation are provided with RESTRICTED RIGHTS.

  Use, duplication, or disclosure by the Government is subject to restrictions set forth in subparagraph (c)(1) of The Rights in Technical Data and Computer Software clause at DFARS 252.227-7013 or subparagraphs (c)(1)(ii) and (2) of Commercial Computer Software – Restricted Rights at 48 CFR 52.227-19, as applicable.

 

  1. Automatic Renewal. The subscription shall be automatically renewed, unless Licensee notifies Licensor 30 days or more prior to the expiration date of the subscription, of its intent not to renew the subscription.

Accessibility Toolbar