The evil queen Bavmorda (Jean Marsh
) wields black magic to conquer the land and enslave its people. She fears the birth of a child with a peculiar birthmark because prophecies foretell that the child will bring about her downfall. Bavmorda imprisons all the expecting mothers and the child of the prophecy is born. Before Bavmorda has a chance to kill the baby girl (Kate Greenfield
and Ruth Greenfield
), the midwife escapes with her. She sends the blessed baby downstream on a raft. The child washes up near a village inhabited by a race of dwarf-like people called Nelwyns. Willow Ufgood (Warwick Davis
), the farmer and amateur magician who finds the baby, is chosen by the town council to return the child to the world of the "large people," or Daikini. Against their better judgment, Willow and his friend Meegosh (David Steinberg
) entrust the baby to the first Daikini they meet, a renegade warrior named Madmartigan (Val Kilmer
On their way home, Willow and Meegosh are attacked by a clan of Brownies, who have stolen the baby from Madmartigan. The Brownie fairy queen of the forest, Cherlindrea (Maria Holvoe
), tells Willow that he has been chosen to protect the baby, whose name is Elora Danan. Cherlindrea gives Willow a magic wand and directs him to ask the sorceress Fin Raziel (Patricia Hayes
) for help. Cherlindrea sends along two brownies as guides, Franjean (Rick Overton
) and Rool (Kevin Pollak
). Willow's party bumps into Madmartigan, who helps them in a few close calls with Sorsha (Joanne Whalley
), Bavmorda's daughter. Willow and the rest of the group finally meet Raziel, only to find that the sorceress has been turned into a rodent by Bavmorda.
Sorsha captures Willow and his associates. They start a long trek to Nockmaar castle, Bavmorda's stronghold. Willow attempts to use magic to return Raziel to her human form, but fails. Meanwhile, Madmartigan and the Brownies manage to escape, while Madmartigan, under the influence of the Brownies' love potion, becomes temporarily infatuated with Sorsha. Willow and the group escape from Sorsha's control and make a hasty retreat with stolen horses. The group eventually finds the castle of Tir Asleen, where Cherlindrea told them they would find protection from Bavmorda, but the castle is under Bavmorda's spell; all its inhabitants are frozen in ice. Madmartigan, refusing to give up hope, prepares for Sorsha's attack while Willow once again fails to transform Raziel into human form.
Sorsha and her army arrive, but so does the Army of Galladoorn, led by Madmartigan's old friend Airk Thaughbaer (Gavan O'Herlihy
). During the ensuing battle, Sorsha falls in love with Madmartigan and changes sides. Nockmaar's General Kael (Pat Roach
), however, captures Elora and takes her to Nockmaar. Willow, Madmartigan, Sorsha, the Brownies, the sorceress Fin Raziel (now in the shape of a goat), and what is left of Airk's army set up camp, preparing to storm Nockmaar castle to rescue Elora. Willow finally returns Raziel to her true form, and the sorceress puts a spell on the camp to protect them from Bavmorda's magic. The battle at Nockmaar begins the next day. Willow manages to save Elora at the last moment from Bavmorda's murderous ritual, and Bavmorda is destroyed, in part by her own magic. He leaves the baby in the caring arms of Madmartigan and Sorsha. Willow returns happily to his village and his family with a gift from Raziel: a book of magic to study.