Cómo encontrar el VID, PID, proveedor SCSI y la información de producto de una memoria USB en Windows

Diagrama de flujo que muestra cómo Windows identifica un dispositivo USB mediante la enumeración USB, los descriptores USB con VID y PID, la carga del controlador de almacenamiento masivo y una consulta SCSI que informa el proveedor, el producto y la revisión.

Hay algo especialmente satisfactorio en conectar un dispositivo USB a una computadora con Windows y verlo aparecer casi de inmediato. Windows identifica el hardware, carga el controlador correspondiente, asigna una letra de unidad al dispositivo de almacenamiento y, en uno o dos segundos, la memoria USB queda lista para usarse.

La mayoría de los usuarios nunca necesita pensar en lo que ocurrió durante esos pocos segundos. Sin embargo, para desarrolladores, administradores de TI, ingenieros de hardware y cualquier persona que escriba software que interactúe con dispositivos USB, ese proceso automático plantea una pregunta importante: ¿de dónde obtiene Windows la información que utiliza para identificar el dispositivo?

Una memoria USB puede informar más de una identidad. En el nivel USB, el dispositivo comunica un Vendor ID, conocido normalmente como VID, y un Product ID, conocido normalmente como PID. Después de que Windows reconoce el dispositivo como almacenamiento masivo USB, el dispositivo de almacenamiento también puede comunicar una cadena SCSI Vendor, una cadena SCSI Product y una revisión del producto.

Esos valores están relacionados porque describen el mismo dispositivo físico, pero no proceden del mismo lugar. No son intercambiables y no siempre identifican al mismo fabricante ni muestran el mismo nombre de producto.

Windows 10 ofrece varias formas de ver o recuperar esta información. Algunos métodos están diseñados para una persona sentada frente a la computadora. Otros son más adecuados para scripts, sistemas de inventario, software de diagnóstico o aplicaciones que necesitan identificar automáticamente dispositivos de almacenamiento USB.

VID y PID USB frente a proveedor y producto SCSI

Antes de analizar los diferentes métodos disponibles en Windows, conviene entender las dos identidades implicadas.

El USB Vendor ID y el Product ID proceden de los descriptores USB del dispositivo. Estos valores se comunican cuando el dispositivo USB se conecta por primera vez y Windows inicia el proceso de enumeración USB.

Un identificador típico de hardware USB puede verse así:

USB\VID_090C&PID_1000&REV_1100
USB\VID_090C&PID_1000

En este ejemplo, los valores son:

USB VID = 090C
USB PID = 1000

El VID está pensado para identificar al proveedor USB, mientras que el PID identifica un producto o una familia de productos asignada por ese proveedor. Ambos valores son números hexadecimales.

Después de que Windows determina que el dispositivo conectado es un dispositivo USB Mass Storage, se comunica con él mediante la capa de comandos de almacenamiento. Una respuesta estándar de SCSI Inquiry puede incluir una cadena Vendor, una cadena Product y una cadena Revision.

Un identificador de hardware de almacenamiento puede verse así:

USBSTOR\Disk&Ven_Generic&Prod_Flash_Disk&Rev_8.07

En este ejemplo, los valores son:

SCSI Vendor   = Generic
SCSI Product  = Flash Disk
SCSI Revision = 8.07

El VID y el PID USB son identificadores numéricos utilizados durante la enumeración USB. Los campos SCSI Vendor y Product son cadenas de texto comunicadas mediante la interfaz de almacenamiento. Un fabricante puede modificar una de estas identidades sin modificar necesariamente la otra.

Por eso una memoria USB puede informar un VID asociado al fabricante del controlador, mientras que el campo SCSI Product muestra un nombre comercial, el nombre de un cliente o algo genérico como “USB Flash Disk”.

Cómo construye Windows las dos identidades del dispositivo

La forma más sencilla de visualizar el proceso es dividirlo en dos etapas. Primero, Windows identifica el hardware USB conectado. Después, identifica el dispositivo de almacenamiento que funciona mediante esa conexión USB.

El VID y el PID USB quedan disponibles durante la primera etapa. Los campos SCSI Vendor, Product y Revision quedan disponibles después de que se carga el controlador de almacenamiento masivo USB y Windows consulta el dispositivo de almacenamiento.

Esta diferencia también ayuda a explicar por qué Windows puede recordar un dispositivo USB después de que ha sido desconectado. Como explicamos en nuestro artículo sobre por qué Windows guarda un historial de los dispositivos USB conectados anteriormente, Windows almacena la información recopilada durante la enumeración para poder reconocer y administrar el hardware la próxima vez que aparezca.

¿Por qué podría alguien necesitar ambos conjuntos de información?

Para una solución de problemas sencilla, el VID y el PID USB pueden ser suficientes. Para inventarios de dispositivos, fabricación, diagnósticos o desarrollo de software, recopilar ambas identidades ofrece una imagen más completa.

Una aplicación de inventario puede utilizar el VID y el PID USB para agrupar dispositivos según su plataforma de hardware, mientras muestra al usuario las cadenas SCSI Vendor y Product. Una utilidad de fabricación puede confirmar que se ha conectado un controlador USB compatible antes de realizar una operación. Un programa de diagnóstico puede registrar todos los identificadores para que posteriormente puedan compararse los resultados de distintos dispositivos.

Las herramientas de análisis forense digital pueden recopilar los identificadores como parte del registro de un dispositivo. El software de validación USB puede comparar la identidad que informa el dispositivo con el comportamiento observado durante las pruebas. Esto puede ser útil porque el nombre, la capacidad y el rendimiento declarados por un dispositivo USB no demuestran necesariamente qué hardware contiene realmente.

El mismo principio se aplica a la integridad de los datos. La información de identificación nos dice qué afirma ser el dispositivo, mientras que las pruebas nos dicen cómo se comporta. Nuestro artículo que explica por qué la verificación de datos USB debería incluir en algunos casos un ciclo de alimentación analiza una diferencia similar entre la información comunicada inmediatamente y la información demostrada después de desconectar y volver a conectar el dispositivo.

Método 1: utilizar el Administrador de dispositivos de Windows

El Administrador de dispositivos es el lugar más sencillo para comenzar porque no requiere una línea de comandos, scripts ni programación. El detalle importante es que la identidad USB y la identidad de almacenamiento suelen aparecer bajo dos entradas de dispositivo diferentes.

Encontrar el VID y el PID USB

Abra el Administrador de dispositivos y expanda la sección denominada Controladoras de bus serie universal. Localice el dispositivo de almacenamiento masivo USB asociado con la unidad, haga clic con el botón derecho sobre él y seleccione Propiedades.

Seleccione la pestaña Detalles y elija Id. de hardware en la lista desplegable Propiedad.

Administrador de dispositivos
→ Controladoras de bus serie universal
→ Dispositivo de almacenamiento masivo USB
→ Propiedades
→ Detalles
→ Id. de hardware

Un resultado típico puede verse así:

USB\VID_090C&PID_1000&REV_1100
USB\VID_090C&PID_1000

Los cuatro caracteres que aparecen después de VID_ corresponden al USB Vendor ID. Los cuatro caracteres que aparecen después de PID_ corresponden al USB Product ID.

Encontrar el proveedor y el producto SCSI

Vuelva al Administrador de dispositivos y expanda Unidades de disco. Localice la memoria USB, haga clic con el botón derecho sobre ella y seleccione Propiedades. Abra nuevamente la pestaña Detalles y seleccione Id. de hardware.

Administrador de dispositivos
→ Unidades de disco
→ Memoria USB
→ Propiedades
→ Detalles
→ Id. de hardware

El resultado puede parecerse a este:

USBSTOR\Disk&Ven_Generic&Prod_Flash_Disk&Rev_8.07

Windows ha dado formato a los valores como un identificador de hardware Plug and Play:

Ven_Generic     = SCSI Vendor
Prod_Flash_Disk = SCSI Product
Rev_8.07        = SCSI Revision

El Administrador de dispositivos es una excelente opción cuando se inspecciona manualmente un solo dispositivo. Su limitación es que relacionar la entrada correcta de almacenamiento masivo USB con la entrada correcta de unidad de disco puede resultar confuso cuando hay varias memorias USB conectadas al mismo tiempo.

Método 2: utilizar PowerShell

PowerShell es una mejor opción cuando la información debe recopilarse repetidamente, mostrarse en un informe o recuperarse desde más de una computadora. Windows 10 incluye PowerShell y los cmdlets de Plug and Play necesarios para realizar una inspección básica de dispositivos.

Mostrar los dispositivos USB presentes que contienen un VID y un PID

Abra PowerShell y ejecute el siguiente comando:

Get-PnpDevice -PresentOnly |
Where-Object {
    $_.InstanceId -match '^USB\\VID_'
} |
Select-Object FriendlyName, Class, InstanceId

La salida incluirá identificadores de instancia del dispositivo similares a este:

USB\VID_090C&PID_1000\1234567890

El siguiente ejemplo extrae el VID y el PID en columnas separadas:

Get-PnpDevice -PresentOnly |
Where-Object {
    $_.InstanceId -match '^USB\\VID_'
} |
ForEach-Object {
    if ($_.InstanceId -match 'VID_([0-9A-F]{4})&PID_([0-9A-F]{4})') {
        [PSCustomObject]@{
            DeviceName = $_.FriendlyName
            VID        = $matches[1]
            PID        = $matches[2]
            InstanceId = $_.InstanceId
        }
    }
}

Esto resulta útil porque convierte una larga cadena de instancia de dispositivo de Windows en un resultado más limpio que contiene el nombre del dispositivo, el VID y el PID.

Mostrar información de almacenamiento USB

El siguiente comando de PowerShell consulta la clase de unidades de disco de Windows y filtra los resultados para mostrar dispositivos de almacenamiento USB:

Get-CimInstance Win32_DiskDrive |
Where-Object {
    $_.InterfaceType -eq 'USB' -or
    $_.PNPDeviceID -like 'USBSTOR*'
} |
Select-Object DeviceID,
              Manufacturer,
              Model,
              FirmwareRevision,
              PNPDeviceID

Un resultado puede verse así:

DeviceID        : \\.\PHYSICALDRIVE2
Manufacturer    : Generic
Model           : Flash Disk USB Device
FirmwareRevision: 8.07
PNPDeviceID     : USBSTOR\DISK&VEN_GENERIC&PROD_FLASH_DISK&REV_8.07...

Los campos Manufacturer y Model pueden resultar prácticos, pero no todos los dispositivos de almacenamiento USB los rellenan de forma consistente. El campo PNPDeviceID suele ofrecer la representación más clara de los valores Vendor, Product y Revision recibidos por Windows.

PowerShell es una de las mejores opciones de uso general porque no requiere una aplicación compilada. La parte más difícil es relacionar una entrada de dispositivo a nivel USB con su disco físico correspondiente cuando hay varios dispositivos conectados. Un script más avanzado puede seguir las relaciones de dispositivos principales y secundarios de Windows para realizar esa correspondencia.

Método 3: utilizar WMI o el comando WMIC

Windows Management Instrumentation, normalmente abreviado como WMI, se ha utilizado durante muchos años para recuperar información sobre el hardware y el sistema operativo. Muchas computadoras con Windows 10 también incluyen la antigua utilidad de línea de comandos WMIC.

WMIC resulta útil para pruebas rápidas y para mantener scripts antiguos, aunque PowerShell y CIM suelen ser mejores opciones para nuevos desarrollos.

Mostrar información de discos USB con WMIC

Abra el Símbolo del sistema y ejecute:

wmic diskdrive get DeviceID,InterfaceType,Manufacturer,Model,FirmwareRevision,PNPDeviceID

Para limitar el resultado a las unidades de disco que utilizan una interfaz USB, ejecute:

wmic diskdrive where "InterfaceType='USB'" get DeviceID,Manufacturer,Model,FirmwareRevision,PNPDeviceID

Un resultado típico puede parecerse a este:

DeviceID             Manufacturer  Model                  FirmwareRevision
\\.\PHYSICALDRIVE2   Generic       Flash Disk USB Device  8.07

La columna PNPDeviceID puede contener un valor más largo:

USBSTOR\DISK&VEN_GENERIC&PROD_FLASH_DISK&REV_8.07\...

Buscar entradas Plug and Play con valores VID y PID USB

El siguiente comando WMIC busca dispositivos Plug and Play cuyas entradas contengan un VID USB:

wmic path Win32_PnPEntity where "PNPDeviceID like 'USB%%VID_%%'" get Name,PNPDeviceID

WMIC utiliza los signos de porcentaje duplicados como caracteres comodín dentro de la consulta.

WMIC puede no estar disponible o habilitado en todas las instalaciones recientes de Windows, y Microsoft ha estado orientando los scripts administrativos hacia PowerShell. Sin embargo, para una utilidad de Windows 10 o un script empresarial existente, WMI todavía puede proporcionar información útil.

Método 4: utilizar Windows SetupAPI

El software escrito en C o C++ puede recuperar información de los dispositivos Plug and Play de Windows mediante SetupAPI. Es un enfoque práctico para aplicaciones de escritorio que necesitan detectar dispositivos USB automáticamente, en lugar de pedir al usuario que los busque en el Administrador de dispositivos.

Una aplicación completa de SetupAPI incluye control de errores, búferes dinámicos, análisis de propiedades del dispositivo y liberación de recursos. El siguiente ejemplo abreviado muestra las principales llamadas de Windows implicadas.

Crear un conjunto de información de dispositivos

#include <windows.h>
#include <setupapi.h>

HDEVINFO deviceInfoSet = SetupDiGetClassDevsW(
    nullptr,
    L"USB",
    nullptr,
    DIGCF_ALLCLASSES | DIGCF_PRESENT
);

Esto crea un conjunto de información que contiene los dispositivos USB presentes actualmente en la computadora.

Enumerar las entradas de dispositivos

SP_DEVINFO_DATA deviceInfoData{};
deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

for (
    DWORD index = 0;
    SetupDiEnumDeviceInfo(
        deviceInfoSet,
        index,
        &deviceInfoData
    );
    ++index
) {
    // Recuperar aquí las propiedades del dispositivo.
}

Leer la propiedad del identificador de hardware

WCHAR hardwareIds[4096]{};
DWORD requiredSize = 0;

if (SetupDiGetDeviceRegistryPropertyW(
        deviceInfoSet,
        &deviceInfoData,
        SPDRP_HARDWAREID,
        nullptr,
        reinterpret_cast<PBYTE>(hardwareIds),
        sizeof(hardwareIds),
        &requiredSize
    )) {

    // Buscar en hardwareIds:
    // VID_xxxx
    // PID_xxxx
}

La propiedad devuelta para el identificador de hardware puede contener una o más cadenas separadas por caracteres nulos. Una entrada de dispositivo USB puede contener un identificador como este:

USB\VID_090C&PID_1000&REV_1100

La aplicación puede buscar en esa cadena los campos VID_ y PID_ y extraer los cuatro caracteres hexadecimales siguientes.

Al terminar, debe liberarse el conjunto de información de dispositivos:

SetupDiDestroyDeviceInfoList(deviceInfoSet);

SetupAPI es potente, pero existe un detalle importante: Windows representa el dispositivo USB y el disco físico como nodos separados dentro del árbol de dispositivos. Recuperar el VID y el PID USB es relativamente directo. Relacionar esos valores con el disco correcto, la letra de unidad y la identidad SCSI puede requerir recorrer las relaciones de dispositivos principales y secundarios.

Esta es una de las razones por las que una aplicación comercial de diagnóstico suele necesitar más código del que sugiere una demostración breve. Las propiedades individuales están disponibles, pero el verdadero trabajo consiste en reunir correctamente toda la información en un único registro del dispositivo.

Método 5: consultar directamente el dispositivo de almacenamiento

Una aplicación de Windows puede consultar un disco físico abriendo el dispositivo y enviando una solicitud IOCTL_STORAGE_QUERY_PROPERTY. Este método es útil para recuperar información de almacenamiento como Vendor, Product, Revision, número de serie y tipo de bus.

El siguiente ejemplo abre PhysicalDrive2. El número real de la unidad física dependerá de la computadora y del dispositivo USB que se esté inspeccionando.

Abrir la unidad física

HANDLE drive = CreateFileW(
    L"\\\\.\\PhysicalDrive2",
    GENERIC_READ,
    FILE_SHARE_READ | FILE_SHARE_WRITE,
    nullptr,
    OPEN_EXISTING,
    0,
    nullptr
);

if (drive == INVALID_HANDLE_VALUE) {
    // Gestionar el error.
}

Preparar la consulta de almacenamiento

STORAGE_PROPERTY_QUERY query{};
query.PropertyId = StorageDeviceProperty;
query.QueryType  = PropertyStandardQuery;

Enviar la consulta a Windows

BYTE buffer[4096]{};
DWORD bytesReturned = 0;

BOOL result = DeviceIoControl(
    drive,
    IOCTL_STORAGE_QUERY_PROPERTY,
    &query,
    sizeof(query),
    buffer,
    sizeof(buffer),
    &bytesReturned,
    nullptr
);

Interpretar el descriptor de almacenamiento devuelto

if (result) {
    auto descriptor =
        reinterpret_cast<STORAGE_DEVICE_DESCRIPTOR*>(buffer);

    const char* vendor =
        descriptor->VendorIdOffset
            ? reinterpret_cast<const char*>(
                buffer + descriptor->VendorIdOffset
              )
            : "";

    const char* product =
        descriptor->ProductIdOffset
            ? reinterpret_cast<const char*>(
                buffer + descriptor->ProductIdOffset
              )
            : "";

    const char* revision =
        descriptor->ProductRevisionOffset
            ? reinterpret_cast<const char*>(
                buffer + descriptor->ProductRevisionOffset
              )
            : "";

    const char* serial =
        descriptor->SerialNumberOffset
            ? reinterpret_cast<const char*>(
                buffer + descriptor->SerialNumberOffset
              )
            : "";
}

Las cadenas no se almacenan directamente dentro de la parte fija de la estructura. En su lugar, la estructura proporciona desplazamientos en bytes que apuntan a las ubicaciones de esas cadenas dentro del búfer devuelto.

Cuando haya terminado de utilizar el identificador de la unidad física, ciérrelo:

CloseHandle(drive);

Una consulta de almacenamiento realizada correctamente puede proporcionar información similar a esta:

Vendor   = Generic
Product  = Flash Disk
Revision = 8.07
Serial   = 1234567890
Bus Type = USB

Este método está más cerca del dispositivo de almacenamiento que leer un nombre descriptivo desde el Administrador de dispositivos o consultar un valor almacenado en caché en el Registro. Sin embargo, no devuelve automáticamente el VID y el PID USB. La aplicación todavía debe relacionar el disco físico con su dispositivo USB principal y recuperar por separado el identificador de hardware USB, normalmente mediante SetupAPI o las funciones de Windows Configuration Manager.

¿Qué método de Windows debería utilizar?

No existe un único método que sea el mejor para todas las situaciones. La elección correcta depende de si el objetivo es una inspección manual, la creación de scripts, el desarrollo de software o el análisis de dispositivos a bajo nivel.

Abrir la comparación de métodos de identificación USB en Windows
Método VID/PID USB Vendor/Product SCSI Programación necesaria Mejor uso
Administrador de dispositivos No Inspeccionar manualmente un dispositivo
PowerShell Scripts sencillos Inventarios e informes repetibles
WMI o WMIC Scripts sencillos Sistemas antiguos y scripts existentes
SetupAPI Mediante la correlación de dispositivos Aplicaciones de Windows y utilidades USB
Consulta de almacenamiento No directamente Diagnósticos e información directa de almacenamiento

Para una persona que revisa una sola memoria USB, el Administrador de dispositivos suele ser suficiente. Para administradores que recopilan información desde muchas computadoras, PowerShell probablemente sea el mejor punto de partida. Para desarrolladores que crean una utilidad de Windows, SetupAPI combinado con una consulta de propiedades de almacenamiento ofrece el enfoque más completo.

¿Es el Registro de Windows otro método?

Windows almacena información de enumeración USB en el Registro y es posible localizar allí tanto entradas USB como entradas de almacenamiento USB.

Las entradas de dispositivos USB suelen encontrarse en:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB

Las entradas de almacenamiento USB suelen encontrarse en:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR

Estas ubicaciones son útiles para solucionar problemas y realizar análisis históricos, pero el Registro no debe confundirse con la fuente original de la información. Windows crea y actualiza estas entradas después de haber enumerado el dispositivo USB y consultado la interfaz de almacenamiento.

El VID y el PID USB originales proceden de los descriptores USB. Los valores originales Vendor, Product y Revision del almacenamiento proceden de la respuesta Inquiry del dispositivo de almacenamiento. El Registro es el lugar donde Windows guarda los resultados para utilizarlos posteriormente.

Los permisos del Registro también pueden hacer que el acceso directo resulte incómodo para el software. Cuando una aplicación solamente necesita información sobre los dispositivos que están conectados actualmente, las API de dispositivos compatibles de Windows suelen ser una mejor opción.

Por qué los nombres USB y SCSI pueden no coincidir

Es habitual esperar que todos los identificadores muestren el mismo nombre de fabricante. En la práctica, las memorias USB se construyen con varias capas de hardware y firmware, y cada una de esas capas puede informar algo diferente.

Una empresa que vende memorias USB al por menor puede comprar el controlador a otro fabricante. El VID USB puede identificar al proveedor del controlador o a la empresa responsable del firmware, mientras que el campo SCSI Product puede contener el nombre comercial de la marca. En otros casos, las cadenas SCSI permanecen completamente genéricas.

Un dispositivo puede informar:

USB VID      = 090C
USB PID      = 1000
SCSI Vendor  = Generic
SCSI Product = Flash Disk

Otra memoria USB puede informar:

USB VID      = 0951
USB PID      = 1666
SCSI Vendor  = Kingston
SCSI Product = DataTraveler 3.0

Ninguno de los dos formatos demuestra automáticamente que el producto sea auténtico. Estos identificadores son útiles para la identificación y la correlación, pero son valores comunicados por el firmware. Un dispositivo suficientemente modificado o falsificado puede informar cualquier valor que haya sido programado en él.

Esta es una diferencia importante para los desarrolladores que crean software de validación de dispositivos. Los valores de identificación deben registrarse, pero no deben sustituir las pruebas de capacidad, la verificación de escritura y lectura, las pruebas de rendimiento ni otras formas de análisis del comportamiento.

Un registro práctico del dispositivo

Para el software que inventaría o prueba memorias USB, un registro útil del dispositivo puede incluir más de cuatro campos.

USB VID
USB PID
USB Revision
USB Serial Number
SCSI Vendor
SCSI Product
SCSI Revision
Storage Serial Number
Physical Drive Number
Drive Letter
Reported Capacity
Bus Type
Connection Speed

No todas las memorias USB proporcionarán todos los valores. Los números de serie pueden faltar, estar duplicados o comunicarse de forma diferente en los niveles USB y de almacenamiento. Las cadenas del fabricante pueden estar vacías. Los nombres de producto pueden ser genéricos. El software debe esperar información incompleta, en lugar de asumir que todos los campos estarán siempre disponibles.

El enfoque más sólido consiste en recopilar los identificadores disponibles, conservar los valores originales y después asociarlos con los resultados de rendimiento, capacidad o verificación generados por la aplicación.

Un último punto antes de terminar

Windows 10 ofrece varias formas confiables de encontrar el VID, PID, SCSI Vendor y SCSI Product de una memoria USB. El Administrador de dispositivos proporciona una respuesta manual rápida. PowerShell y WMI ofrecen acceso mediante scripts. SetupAPI permite que las aplicaciones de Windows accedan al árbol de dispositivos Plug and Play, mientras que una consulta directa de propiedades de almacenamiento recupera información asociada con el disco físico.

La lección importante es que un dispositivo de almacenamiento USB tiene más de una identidad. El VID y el PID USB proceden de la capa de enumeración USB. Los valores SCSI Vendor, Product y Revision proceden de la capa de almacenamiento. Consultar solamente uno de estos lugares puede proporcionar únicamente la mitad de la información.

Una vez comprendida esa diferencia, los nombres aparentemente contradictorios que muestra Windows empiezan a tener sentido. El dispositivo no está cambiando necesariamente de identidad. Windows simplemente muestra información recopilada desde dos partes diferentes del mismo hardware.

Nota editorial: Este artículo se basa en trabajo práctico de enumeración de dispositivos USB e identificación de almacenamiento realizado con sistemas Windows. El resultado exacto puede variar según el controlador USB, el firmware, el controlador de Windows y la implementación del dispositivo de almacenamiento. La imagen se creó para facilitar la comprensión de la información con ayuda de herramientas de generación de imágenes basadas en inteligencia artificial.

Read More Articles

Keep exploring more stories, analysis, and technical insights.